字典是k-v键值对的数据的集合 ,是可变的、无序的、key不重复
字典的主要属性如下:
-
通过键访问而不是偏移量来读取
字典有时又叫做关联数组(associative array)或散列表(hash)。它们通过键将一系列值联系起来,这样你就可以使用键从字典中取出初始存储于该键下的一项。像列表一样,你可以使用索引操作从字典中获取内容。但是索引采取键的形式,而不是相对偏移。
-
任意对象的无序集合
与列表不同,保存在字典中的项并没有特定的顺序;实际上,Python将各项伪随机地从左到右随机排序,以便快速查找。
-
长度可变、异构、任意嵌套
与列表相似,字典可以在原位置增长或缩短(无需另外生成一份副本)。它们可以包含任何类型的对象,而且它们支持任意深度的嵌套。每个键只有一个与之相关联的值,但是这个值可以是一系列多个所需对象的集合,而一个值可以同时存储在多个键下。
- a = {}
- a = dict()
- a = {"a": "AA"}
- a = dict([(1,2),("a","b")])
- a = dict(a=1,b=2,c=3)
>>> lst = [1,2]
>>> a = dict.fromkeys(range(10),lst)
>>> a
{0: [1, 2], 1: [1, 2], 2: [1, 2], 3: [1, 2], 4: [1, 2], 5: [1, 2], 6: [1, 2], 7: [1, 2], 8: [1, 2], 9: [1, 2]}
>>> lst.remove(1)
>>> a
{0: [2], 1: [2], 2: [2], 3: [2], 4: [2], 5: [2], 6: [2], 7: [2], 8: [2], 9: [2]}
使用的fromkeys要注意,values是引用地址,等同于浅拷贝
- 返回key对应的value
- key不存在立即抛异常KeyError
>>> a
{0: [2], 1: [2], 2: [2], 3: [2], 4: [2], 5: [2], 6: [2], 7: [2], 8: [2], 9: [2]}
>>> a[1]
[2]
>>> a[-1]
Traceback (most recent call last):
File "<pyshell#242>", line 1, in <module>
a[-1]
KeyError: -1
通过一个字典,来寻找key值的所对应的value,如果没有则返回None
>>> a
{0: [2], 1: [2], 2: [2], 3: [2], 4: [2], 5: [2], 6: [2], 7: [2], 8: [2], 9: [2]}
>>> a.get(0)
[2]
>>> a.get(100)
>>>
setdefault()能新建kv对并返回value
>>> a
{0: [2], 1: [2], 2: [2], 3: [2], 4: [2], 5: [2], 6: [2], 7: [2], 8: [2], 9: [2]}
>>> a.setdefault(10,1000)
1000
>>> a
{0: [2], 1: [2], 2: [2], 3: [2], 4: [2], 5: [2], 6: [2], 7: [2], 8: [2], 9: [2], 10: 1000}
如kv不存在即新增键值对,如果存在则更新
>>> a
{1: 2, 3: 4}
>>> a[5]=6
>>> a
{1: 2, 3: 4, 5: 6}
>>> a[1] = 22
>>> a
{1: 22, 3: 4, 5: 6}
将一个字典更新到一个新的字典中 就地修改
>>> a
{1: 22, 3: 4, 5: 6}
>>> a.update({1:33})
>>> a
{1: 33, 3: 4, 5: 6}
>>> a
{1: 33, 3: 4, 5: 6}
>>> a.update({111: 1111})
>>> a
{1: 33, 3: 4, 5: 6, 111: 1111}
>>> a
{1: 33, 3: 4, 5: 6, 111: 1111}
>>> a.pop(1)
33
>>> a
{3: 4, 5: 6, 111: 1111}
>>> a.pop(3)
4
>>> a
{5: 6, 111: 1111}
#注意pop()不能为空
Traceback (most recent call last):
File "<pyshell#279>", line 1, in <module>
a.pop()
TypeError: pop expected at least 1 arguments, got 0
#缺省值
>>> a
{5: 6, 111: 1111}
>>> a.pop(100,0)
0
注意是无序的
>>> a = {1: 33, 3: 4, 5: 6, 111: 1111}
>>> a
{1: 33, 3: 4, 5: 6, 111: 1111}
>>> a.popitem()
(111, 1111)
>>> a.popitem()
(5, 6)
>>> a
{1: 33, 3: 4}
>>> del a
>>> a
Traceback (most recent call last):
File "<pyshell#290>", line 1, in <module>
a
NameError: name 'a' is not defined
>>> a
{1: 33, 3: 4}
>>> del a[1]
>>> a
{3: 4}
>>> a
{0: 100, 1: 100, 2: 100, 3: 100, 4: 100}
>>> for i in a.keys():
print(i)
0
1
2
3
4
>>> a
{0: 100, 1: 100, 2: 100, 3: 100, 4: 100}
>>> for i in a.values():
print(i)
100
100
100
100
100
#方法二
>>> for i in a:
print(a[i])
100
100
100
100
100
#方法三
>>> for i in a.keys():
print(a.get(i))
100
100
100
100
100
>>> a
{0: 100, 1: 100, 2: 100, 3: 100, 4: 100}
>>> for k,v in a.items():
print(k,v)
0 100
1 100
2 100
3 100
4 100
>>> a
{0: 100, 1: 100, 2: 100, 3: 100, 4: 100}
>>> 3 in a.keys() #hash 高效
True
>>> 101 in a.values() #遍历低效,尽量别用
False
>>> (2,101) in a.items() #hash,高效
False
python3中,keys、values、items方法返回一个类似一个生成器的可迭代对象,不会把函数的返回结果复制到内存中
- 返回Dictionary view对象,可以使用len()、iter()、in操作
- 字典的entry的动态的视图,字典变化,视图将反映出这些变化
- keys返回一个类set对象,也可以是set集合
- 如果values都可以hash,那么items也可以看做类set对象
怎么能在遍历的过程中移除元素
- 错误一
>>> d = dict.fromkeys(range(5),"abc")
>>> d
{0: 'abc', 1: 'abc', 2: 'abc', 3: 'abc', 4: 'abc'}
>>> for k,v in d.items():
d.pop(k)
'abc'
Traceback (most recent call last):
File "<pyshell#335>", line 1, in <module>
for k,v in d.items():
RuntimeError: dictionary changed size during iteration
- 错误二 不如clear()
{1: 'abc', 2: 'abc', 3: 'abc', 4: 'abc'}
>>> while len(d):
d.popitem()
(4, 'abc')
(3, 'abc')
(2, 'abc')
(1, 'abc')
>>> d
{}
- 错误三
>>> d = dict.fromkeys(range(5),"abc")
>>> d
{0: 'abc', 1: 'abc', 2: 'abc', 3: 'abc', 4: 'abc'}
>>> while d:
d.popitem()
(4, 'abc')
(3, 'abc')
(2, 'abc')
(1, 'abc')
(0, 'abc')
>>> d
{}
>>> d
{0: 'abc', 1: 'abc', 2: 'abc', 3: 'abc', 4: 'abc'}
>>> l = []
>>> for k,v in d.items():
if v == "abc":
l.append(k)
>>> for i in l:
d.pop(i)
'abc'
'abc'
'abc'
'abc'
'abc'
collections.defaultdict([default_factory[, ...]])
- 第一个参数是default_factory,缺省的是None,它提供一个初始化函数,当key不存在的时候,会调用这个工厂函数来生成key对应的value
- 构造一个字典,values是列表,为其添加随机个元素
>>> d = defaultdict(list)
>>> d
defaultdict(<class 'list'>, {})
>>> dd = {}
>>> dd
{}
>>> d[1].append('aaa')
>>> d
defaultdict(<class 'list'>, {1: ['aaa']})
>>> dd[1].append('aaa')
Traceback (most recent call last):
File "<pyshell#420>", line 1, in <module>
dd[1].append('aaa')
KeyError: 1
- 有序字典可以记录元素插入的顺序,打印的时候也是按照这个顺序来打印
- 3.6版本的python的字典就是记录key插入顺序(Ipython不一定有效)
- 假设字典记录了N个产品,这些产品的ID由小到大依次加入字典
- 除了使用字典检索的遍历,有时候需要取出ID,但是希望是按照输入的顺序,因为输入顺序是有序的
- 如果无序则还要把遍历到的值进行排序