第四章 字典和集合(当索引行不通时)

一、字典
1. 创建和使用字典

phonebook={'Alice': '2341', 'Beth' : '9102', 'Cecil' : '3258'}
字典由键及其相应的值组成,这种键-值对称为项(item)。在上面例子中,键为名字,值为号码,每个键与值间都用冒号分隔,项之间用逗号隔开,整个字典在花括号中。空子典(没有任何项)用两个花括号表示,即{}。
字典是通过名称来访问其各个值的数据结构,这种数据结构称为映射。
创建字典的方法:

  • a=dict (one=1, two=2, three=3)
  • b= {‘one’:1, ‘two’:2, ‘three’:3}
  • c=dict({‘three’:3, ‘one’:1, ‘two’:2})
  • a ==c ->True
  • 另外还可以直接给键赋值,如果键存在,则改写对应的值;如果不存在,则创建一个新的键赋值;
  • dict1=dict (F=70, i=105, s=115, h=104, c=67) dict1['x']=88 dict1 ->{'F':70, 'i' :105, 's':115, 'h':104, 'c' :67, 'x':88} dict1['x']=120 dict1 ->{'F':70, 'i' :105, 's':115, 'h':104, 'c' :67, 'x':120}
    注意:
  • 字典和序列不同的是,序列讲究顺序,而字典讲究映射,不讲顺序
  • 字典的键必须独一无二,而值可以取任何数据类型,但必须不可变的(如字符串、数字或元组)
  • 用dict( )函数来创建字典时,dict函数的参数可以是一个序列(但不能多个),所以要打包成一个元组序列(列表也可以),但参数只能是一个;
2. 基本的字典操作

字典的基本行为在很多方面都类似于序列。

  • len (d) 返回字典d包含的项(键-值对)数。
  • d [k] 返回与键k相关联的值,相当于索引键对应的值,中括号内不能输入值,否则会报错。
  • d [k] =v将值v关联到键k。
  • del d[k] 删除键为k的项。
  • k in d 检查字典d是否包含键为k的项。 (这个 查找的是键,而不是值)
3. 将字符串格式设置功能应用于字典

用format_map( )可以将字典映射出来,有利于提取所需要的信息
`phonebook ={‘Beth’: ‘9102’, ‘Alice’: ‘2341’, ‘Cecil’: ‘3258’}
‘Cecil’s phone number is {Cecil}.’ format_map(phonebook) ->‘Cecil’s phone number is 3258’

字典方法

字典是Python中唯一的映射类型,字典不是序列。序列为一个不存在的值赋值时,会报错。而字典中,则会相应添加到字典中去。

  1. clear :删除所有的字典项,这种操作是就地执行的(和list.sort一样),因此什么都不返回(或者说返回None)
    格式:d.clear( )
  2. copy( ):方法copy返回一个新字典,其包含的键-值对与原来的字典相同 (这个方法执行为浅复制,因为值本身就是原件,而非副本,替换副本,原件不会改变,但修改副本时,则原件也会发生相应的改变)
x={'username': 'admin', 'machine': ['foo', 'bar', 'baz']}   
y=x.copy( )   
y['username']='mlh'   
y['machine'].remove('bar')   
y -> {'username' :'mlh', 'machine': ['foo', 'baz']} 
x -> {'username' :'admin', 'machine' :['foo', 'baz']}     

如果对副本进行修改后,不能修改原件,则需要用模块copy中的函数deepcopy

from copy import deepcopy   
d={}  
d['name']=['alfred', 'betrand']  
c=d.copy  
dc=deepcopy(d)  
d['name'].append('clive')  
c ->{'name': ['alfred',  'betrand', 'clive']}  
dc ->{'name': ['alfred', 'betrand']}
  1. fromkeys:方法fromkeys创建一个新字典,其中包含指定的键,且默认情况下每个键对应的值都是None.当然也可以对每个键指定相应的值。
    dict.fromkeys([‘name’, ‘age’]) ->{‘name’: None, ‘age’: None}
    dict.formkeys ([‘name’, ‘age’], ‘(unknow)’) ->{‘name’: ‘unknown’, ‘age’: 'unknown} (注意单引号在括号外)
  2. get
    方法get为访问字典项提供了宽松的环境。通常,如果你试图访问字典中没有的项,将引发错误,而使用get来访问不存在的键时,没有引发异常,而是会返回None(默认),也可以人为指定返回值。
  3. items
    方法items返回一个包含所有字典的列表,其中每个元素都为(key, value)的形式。字典项在列表中的排列顺序不确定 (注意返回值为列表)这种返回值属于一种名为字典视图的特殊类型。字典视图可用于迭代,另外也可以确定其长度和成员资格检查。
    d={'title' :'python web site', 'url': 'http://www.python.org', 'spam': 0} d.items() ->dict_items([('url', :'http://www.python.org'), ('spam', 0), ('title', 'python web site')])
  4. keys :方法keys返回一个字典视图,其中包含指定字典中的键。 dict.keys() 以列表返回一个字典所有的键
  5. pop:用于获取与指定键相关联的值,并将该键-值对从字典中删除(与“索引”不同的是,它返回值后将删除)
    d={'x':1, 'y':2} d.pop('x') ->1 d ->{'y':2}
  6. popitem
    方法popitem类似于list.pop,但list.pop弹出列表中的最后一个元素, 而popitem随机弹出一个字典项,因为字典项的顺序是不确定的,没有最后一个元素之说,所以也无法使用列表中pop函数,但可以用popitem逐一删除每个项。
  7. setdefault
    方法setdefault与get类似,因为它也获取与指定的键相关联的值,除此之外,setdefault还在字典不包括指定的键时,在字典中添加指定的键-值对。(即指定的键不存在时,setdefault返回指定的值并相应地更新字典。如果指定的键存在,就返回其值,并保持字典不变。与get一样,默认为None,但可更改。
    d ={} d.setdefault('name', 'N/A')->'N/A' d ->{'name': 'N/A'} d['name']='Gumby' d.setdefault('name', 'N/A')->'Gumby' d->{'name' :'Gumby'}
  8. update :方法update使用一个字典中的项来更新另一个字典
  9. values :方法values返回一个由字典中的值组成的字典视图(这个返回的值与items类似)
    `d={}
    d[1]=1
    d[2]=2
    d[3]=3
    d.value( )->dict_value([1, 2 , 3, 4])
二、集合

集合(set)又称为字典的表亲,因为它和字典一样,都是无序的,所以索引、切片等操作都是无法使用的,但它有一个很重要的特点就是它是唯一的,没有重复的元素。
**1. 创建集合 **

  • 用大括号{}直接把所有元素括起来 set1={'小甲鱼', '小鱿鱼', '小护士', '小甲鱼'}
  • 用set( )创建 set2=set(['小甲鱼', '小鱿鱼', '小护士', '小甲鱼']) set1==set2->True
  • 空集合必须用set ( )而不是{ },因为{ }是用来创建一个空子典的。
    **2. 访问集合 **
  • 使用迭代把集合中的所有数据都读取出来(for …each)
  • 使用in和not in 判断一个元素是否在集合中
  • 使用add( )方法可以为集合添加元素,使用remove( )/discard()/pop( )/clear( )删除集合中已知的元素
   set1={1,2,3,4,5}
   set1.add(6)
   set1->{1, 2, 3, 4, 5, 6}
   set1.remove(5)
   set1->{1, 2, 3, 4, 6}
   set1.update(7,8,9)
   set1->{1,2,3,4,6,7,8,9}
  1. 不可变集合
    即使集合像元组一样不能随意增加和删除其中的元素,那可以定义不可变集合,用frozenset( )函数
    set1=frozenset({1, 2, 3, 4, 5})
  2. 集合操作
    A=set('abcd'), B=set('cdef')
  • &:交集 `A & B’ ->{‘d’, ‘c’}
    • |:合集,并集 `A|B或 A.union(B) ->{‘e’, ‘f’, ‘d’, ‘c’, ‘b’, ‘a’}
    • -:差集,相对补集,A与B的差集是所有属于A且不属于B的元素构成的集合 `A-B’ ->{‘b’, ‘a’};B-A ->{‘e’,‘f’}
    • ^:对称差是只属于其中一个集合,而不属于另一个集合的元素组成的集合 A^B ->{‘b’, ‘a’, ‘e’, ‘f’}
    • <:执行子集操作,也可用issubset( ).A=set('abcd') B=set('cdef') C=set('ab') C<A->True
    • in or not in
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值