浅谈python中字典
1.字典的定义方式有以下:
a=dict(one=1,two=2,three=3) b={'one':1,'two':2,'three':3} c=dict(zip(['one','two','three'],[1,2,3])) d=dict([('two',2),('one',1),('three',3)]) e=dict({'three':3,'one':1,'two':2})
其中这四种定义方式完全等效,有一点需要牢记,标准库中所有的映射类型都是通过字典(dict)来实现,其中只有可散列(hashable)类型才能作为字典的键。
可散列数据类型:简单来说,如果一个数据是可散列数据类型,那么,在这个对像生命周期中,其值保持不变。一般来说,不可变数据类型是可散列数据类型,用户自定义的数据类型也是可散列数据类型,散列值就是其id()返回值。
2.字典推导:
除了上述构造方式可以创建字典外,还可以采用字典推导的方式:
DIAL_CODES=[(86,'China'), (91,'India'), (1,'United States'), (62,'Indonesia'), (81,'Japan')] country_code={country:code for code,country in DIAL_CODES}#定义字典推导 print(country_code)
下面总结以下python中常见类型的推导方式:
1)列表推导:[expression for item in iterable]
number_list=[num for num in range(1,4)]#列表推导 print(number_list) #[1, 2, 3]
2)集合推导:{expersion for expersion in iterable}
a_set={number for number in range(1,6) if number%2==0}#列表推导,其中所有推导方式都可以在其后面加入判断方式 print(a_set) #{2, 4}
3)生成器表达式:与列表推导类似,只是将‘[]’换成‘()’,
colors=['black', 'white'] sizes=['S', 'M', 'L'] for tshirt in ('%s %s'%(c,s) for c in colors for s in sizes): print(tshirt) # black S # black M # black L # white S # white M # white L
3.字典查找:d={'a':1,'b':2}
在进行查找时,若直接调用d[..]方式进行查找,当找不到对应键时会报错,可以通过d.get(k,default)//若未查到对应键,返回默认default值。
当然,还有其他方法,如:
通过定义defaultdict类型代替普通dict类型,或自定义一个类,该类继承自dict类型,并在该类型中实现__missing__方法。
import collections DIAL_CODES=[(86,'China'), (91,'India'), (1,'United States'), (62,'Indonesia'), (81,'Japan')] d=collections.defaultdict(list,DIAL_CODES)#在字典查询时若键不存在会返回指定的list类型 print(d[86])#China print(d['c'])#[]
class StrKeyDict0(dict): def __missing__(self,key): #自定义类型,处理键未找到时,的处理方式 return "键:" +key +" 未找到" DIAL_CODES=[(86,'China'), (91,'India'), (1,'United States'), (62,'Indonesia'), (81,'Japan')] d=StrKeyDict0(DIAL_CODES) print(d['62']) #键:62 未找到,因为字典中的键为int类型
下面看一下__missing__():
所有的映射在找不到对应的键时都会牵扯到该方法,其中该方法只会被__getitem__调用(d[k])。
4.字典的变种
4.1 collections.OrderedDict:
这个类型在添加键时会保持顺序,因此键的迭代顺序是一致的。有属性popitem(last=True),移除并返回一个(key,value), last=True 先进后出,否则先进先出。
import collections tru=[('a',1),('b',2),('c',3),('d',4)] d=collections.OrderedDict(tru) d.move_to_end('b',last=False) #将键默认移到末尾(last=True),last=False,移到开头 print(','.join(d.keys())) #b,a,c,d print(d.popitem(last=False)) #默认返回字典最后一个(last=True)('d', 4),last=False返回第一个
4.2 collections.ChainMap:
该类型可以容纳数个不同的映射对象,然后在进行键查找时,这些对象会被当成一个整体逐个查找,直到所有键都被找到。
常见属性:
maps:一个可以更新的映射列表。这个列表是按照第一次搜索到最后一次搜索的顺序组织的。它是仅有的存储状态,可以被修改。列表最少包含一个映射。
new_child(m=None):返回一个ChainMap新类,后面跟着当前实例的全部映射,如果 m 被指定,它就成为不同新的实例,就是在所有映射前加上 m,如果没有指定,就加上一个空字典。
parents:属性返回一个新的ChainMap包含当前实例的映射。
import collections baseline = {'music': 'bach', 'art': 'rembrandt'} adjustments = {'art': 'van gogh', 'opera': 'carmen'} print(list(collections.ChainMap(baseline,adjustments)))#返回字典中所有的键,从最后开始查找 d=collections.ChainMap(baseline,adjustments) print(d.parents)#返回ChainMap中除了第一个外的所有字典 print(d.maps[1])#返回字典adjustments print(d.new_child())#ChainMap({}, {'music': 'bach', 'art': 'rembrandt'}, {'art': 'van gogh', 'opera': 'carmen'})
4.3 collections.Counter:
一个 Counter 是一个 dict 的子类,用于计数可哈希对象。它是一个集合,元素像字典键(key)一样存储,它们的计数存储为值。计数可以是任何整数值,包括0和负数。
除了dict方法外,还有以下其他方法:
elements():返回一个迭代器,每个元素将重复出现计数值所指定次数,元素会按顺序返回,如果一个元素的计数小于1,或0会忽略。most_common(n)返回一个列表,包含n个最常见的元素及出现次数,按高低进行排序。
import collections d=collections.Counter(a=4,c=2,b=3,d=0,e=-2) for n in d.elements(): print(n) # a a a a c c b b b d1=collections.Counter('abracadabra').most_common(3) print(d1) #[('a', 5), ('b', 2), ('r', 2)]
5.集合(看帮助文档)
set 对象是由具有唯一性的 hashable 对象所组成的无序多项集。
常见的用途包括成员检测、从序列中去除重复项以及数学中的集合类计算,例如交集、并集、差集与对称差集等等。
set 类型是可变的 --- 其内容可以使用 add() 和 remove() 这样的方法来改变。 由于是可变类型,它没有哈希值,且不能被用作字典的键或其他集合的元素。 frozenset 类型是不可变并且为 hashable --- 其内容在被创建后不能再改变;因此它可以被用作字典的键或其他集合的元素。
集合的数学运算:这些方法或者会生成新集合,或者会在条 件允许的情况下就地修改集合。