浅谈python中字典,,1.字典的定义方式有


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})
View Code

其中这四种定义方式完全等效,有一点需要牢记,标准库中所有的映射类型都是通过字典(dict)来实现,其中只有可散列(hashable)类型才能作为字典的键。

可散列数据类型简单来说,如果一个数据是可散列数据类型,那么,在这个对像生命周期中,其值保持不变。一般来说,不可变数据类型是可散列数据类型,用户自定义的数据类型也是可散列数据类型,散列值就是其id()返回值。

2.字典推导:

除了上述构造方式可以创建字典外,还可以采用字典推导的方式:

技术图片
DIAL_CODES=[(86,‘China‘),            (91,‘India‘),            (1,‘UnitedStates‘),            (62,‘Indonesia‘),            (81,‘Japan‘)]country_code={country:code for code,country in DIAL_CODES}#定义字典推导print(country_code)
View 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 collectionsDIAL_CODES=[(86,‘China‘),            (91,‘India‘),            (1,‘UnitedStates‘),            (62,‘Indonesia‘),            (81,‘Japan‘)]d=collections.defaultdict(list,DIAL_CODES)#在字典查询时若键不存在会返回指定的list类型print(d[86])#Chinaprint(d[‘c‘])#[]
class StrKeyDict0(dict):    def __missing__(self,key):  #自定义类型,处理键未找到时,的处理方式        return "键:" +key +" 未找到"DIAL_CODES=[(86,‘China‘),            (91,‘India‘),            (1,‘UnitedStates‘),            (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 collectionstru=[(‘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,dprint(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 collectionsbaseline = {‘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])#返回字典adjustmentsprint(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 collectionsd=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 bd1=collections.Counter(‘abracadabra‘).most_common(3)print(d1)  #[(‘a‘, 5), (‘b‘, 2), (‘r‘, 2)]

5.集合(看帮助文档)

set 对象是由具有唯一性的 hashable 对象所组成的无序多项集。

常见的用途包括成员检测、从序列中去除重复项以及数学中的集合类计算,例如交集、并集、差集与对称差集等等。

set 类型是可变的 --- 其内容可以使用 add() 和 remove() 这样的方法来改变。 由于是可变类型,它没有哈希值,且不能被用作字典的键或其他集合的元素。 frozenset 类型是不可变并且为 hashable --- 其内容在被创建后不能再改变;因此它可以被用作字典的键或其他集合的元素。

集合的数学运算:这些方法或者会生成新集合,或者会在条 件允许的情况下就地修改集合。

  

  

  

浅谈python中字典

评论关闭