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

其中这四种定义方式完全等效,有一点需要牢记,标准库中所有的映射类型都是通过字典(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)
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 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 --- 其内容在被创建后不能再改变;因此它可以被用作字典的键或其他集合的元素。

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

  

  

  

 

 

 

 

 

posted @ 2019-11-08 22:46  阿贝尔  阅读(245)  评论(0编辑  收藏  举报