字典 DICTIONARY

字典  DICTIONARY

定义:

是一系列键值对,每个键都与一个值相关联。

别名:哈希表、关联数组。

键:

一个对象能不能作为字典的key,就取决于其有没有__hash__方法。所以所有python自带类型中,除了list、dict、set和内部至少带有上述三种类型之一的tuple之外,其余的对象都能当key。

数值/字符串/完全不可变的元祖/函数(内建或自定义)/类(内建或自定义)/方法/包等等都可以,不过有的实际意义不高

两个不同的相等数字可以有相同的哈希值,比如1和1.0。

print(hash(1))               #out: 1
print(hash(1.0))             #out: 1
print(hash('1'))             #out:3261292616000953093
print(hash('1.0'))           #out:5308054082424683454
print(hash((1,2)))           #out:3713081631934410656
#print(hash([1,2]))          #out:TypeError: unhashable type: 'list'
#print(hash({1:2,3:4}))      #out:TypeError: unhashable type: 'dict'
set_1 = set([1,2])
#print(hash(set_1))          #out:TypeError: unhashable type: 'set'
#print(hash((1,[2,3])))      #out:TypeError: unhashable type: 'list'

值:

任何数据类型都可以做值。

创建:

参考:https://www.cnblogs.com/xujiu/p/8352608.html

#创建一个空字典
empty_dict = dict() 
print(empty_dict)

#用**kwargs可变参数传入关键字创建字典
a = dict(one=1,two=2,three=3) 
print(a)

#传入可迭代对象
b = dict(zip(['one','two','three'],[1,2,3]))
print(list(zip(['one','two','three'],[1,2,3])))
print(b)

#传入可迭代对象 
c = dict([('one', 1), ('two', 2), ('three', 3)])
print(c)

c1 = dict([('one', 1), ('two', 2), ('three', 3),('three', 4),('three', 5)])
print(c1)#如果键有重复,其值为最后重复项的值。 


#传入映射对象,字典创建字典  
d = dict({'one': 1, 'two': 2, 'three': 3}) 
print(d) 

print(a == b == c == d)


输出:
{}
{'one': 1, 'two': 2, 'three': 3}
[('one', 1), ('two', 2), ('three', 3)]
{'one': 1, 'two': 2, 'three': 3}
{'one': 1, 'two': 2, 'three': 3}
{'one': 1, 'two': 2, 'three': 5}
{'one': 1, 'two': 2, 'three': 3}
True

查:

dict[key]

如果key在字典中,则返回值。否则会报错

dict_1 = dict([('a',1),('b',2),('c',3)])
print(dict_1['a'])                            #out:1
print('d' in dict_1)                          #out:False
print(dict_1['d'])                            #out:KeyError: 'd'

访问所有的键、值、键值对。

dict_1 = dict([('a',1),('b',2),('c',3)])
print(dict_1.keys())                       #out: dict_keys(['a', 'b', 'c'])    
print(dict_1.values())                     #out: dict_values([1, 2, 3])
print(dict_1.items())                      #out: dict_items([('a', 1), ('b', 2), ('c', 3)])

增:

dict[key_new] = value

dict_3 = dict([('a',1),('b',2),('c',3)])
print(dict_3)         #out:{'a': 1, 'b': 2, 'c': 3}
dict_3['d'] = 4
print(dict_3)         #out:{'a': 1, 'b': 2, 'c': 3, 'd': 4}

删:

del dict[key]

dict_3 = dict([('a',1),('b',2),('c',3)])
print(dict_3)         #out:{'a': 1, 'b': 2, 'c': 3}
dict_3['d'] = 4
print(dict_3)         #out:{'a': 1, 'b': 2, 'c': 3, 'd': 4}
del dict_3['a']
print(dict_3)         #out:{'b': 2, 'c': 3, 'd': 4}

改:

dict_3 = dict([('a',1),('b',2),('c',3)])
print(dict_3)         #out:{'a': 1, 'b': 2, 'c': 3}
dict_3['d'] = 4
print(dict_3)         #out:{'a': 1, 'b': 2, 'c': 3, 'd': 4}
del dict_3['a']
print(dict_3)         #out:{'b': 2, 'c': 3, 'd': 4}
dict_3['b'] = 20
print(dict_3)         #out:{'b': 20, 'c': 3, 'd': 4} 

增改:

dict_3 = dict([('a',1),('b',2),('c',3)])
dict_4 = dict(zip(['b','d','a'],[5,6,1]))
dict_6 = dict_3.update(dict_4)
print(dict_3)                          #out:{'a': 1, 'b': 5, 'c': 3, 'd': 6}
print(dict_4)                          #out:{'b': 5, 'd': 6, 'a': 1}
print(dict_6)                          #out:None
dict_3.update(dict_4)  不返回任何数据,也可以说返回None。

 还有另外一种方法

print({**{'a':1,'b':2}, **{'a':3}})
a = {'a':1,'b':2}
b = {'a':3}
a.update(b)
print(a)

遍历:

dict_1 = dict([('a',1),('b',2),('c',3)])
for k_1 in dict_1:       #默认遍历键。
    print(k_1)
print('------分割线------')
for k in dict_1.keys():
    print(k)
print('------分割线------')
for k in dict_1.values():
    print(k)
print('------分割线------')
for key,value in dict_1.items():
    value =  str(value)
    print(key + ':' + value)

结果:

内置函数:

type 、len 、str

dict_1 = dict([('a',1),('b',2),('c',3)])
print(type(dict_1))             #out:<class 'dict'>
print(len(dict_1))              #out:3
str_d = str(dict_1) 
print(type(str_d))             #out:<class 'str'>

 内置方法:

序号 方法 描述
1 dict.get(key,'default') 得到key对应的值,如果无对应的值,返回default
2 dict.fromkeys(seq,value) 创建一个新字典,以序列 seq 中元素做字典的键,value 为字典所有键对应的初始值。
3 dict.clear() 清空字典。
4 dict.copy() 返回一个浅复制的字典。
5 dict.pop(key) 弹出key对应的值
6 dict.popitems() 随机返回并删除字典中的一对键和值(一般删除末尾对)。
7 dict.keys() 返回一个键的迭代器,可以使用 list() 来转换为列表
8 dict.values() 返回一个值得迭代器,可以使用 list() 来转换为列表
9 dict.items() 以列表返回可遍历的(键, 值) 元组数组
10 dict.setdefault(key,default = None) 如果 key 在 字典中,返回对应的值。如果不在字典中,则插入 key 及设置的默认值 default,并返回 default ,default 默认值为 None。
11 dict_1.update(dict_2) dict_2中的值更新到dict_1中。如果dict_1中不存在,则增加改键值对。

 

推导式:

dict_1 = dict([('a',1),('b',2),('c',3)])
dict_2 ={key:values**2 for key,values in dict_1.items()}
print(dict_2)         # out:{'a': 1, 'b': 4, 'c': 9}

键值对互换:

可以对应创建字典的四种方法。

a = dict(one=1,two=2,three=3) 
a_1 = {}
for key,value in a.items():
    a_1[value] = key
b = dict(zip(['one','two','three'],[1,2,3]))
b_1 = dict(zip(b.values(),b.keys()))
c = dict([('one', 1), ('two', 2), ('three', 3)])
c_1 = dict([value,key] for key,value in c.items() )
d = dict({'one': 1, 'two': 2, 'three': 3}) 
d_1 = {value:key for key,value in d.items()}
d_2 = dict({value:key for key,value in d.items()})
print(a_1)                                       #out:{1: 'one', 2: 'two', 3: 'three'}
print(a_1 == b_1 == c_1 == d_1 == d_2)           #out: True  

嵌套:

字典列表:字典中嵌套列表,此时可以实现一个键对应一个列表,而一个列表又要多个值。

原文地址:https://www.cnblogs.com/qianslup/p/11059544.html