1.基础

1.1 概念

Dict即Dictionary,也称为mapping
Python中,字典由任意个元素构成的集合,每一个元素称为Item,也称为Entry。这个Item是由(key,value)组成
字典是 可变的、无序的、key不重复的key-value键值对组成的

1.2 初始化

  • dict(**kwargs) 使用name=value来初始化一个字典
  • dict(iterable,**kwargs) 使用可迭代对象和name=value来构造字典,不过可迭代对象的元素必须是一个二元结构
  • dict(mapping,**kwargs) 使用一个字典构建另一个字典
1
2
3
4
5
6
7
8
9
10
11
d1 = {}
d2 = dict()
d3 = dict(a=100, b=200)
d4 = dict(d3) # 构造另外一个字典
d5 = dict(d4,a=300,c=400)
d6 = dict([('a',100),['b',200],(1,'abc')],b=300,c=400)

# 类方法dict.fromkeys(iterable,value)
d = dict.fromkeys(range(5))
d = dict.fromkeys(range(5),0)
d = dict.fromkeys(range(5),[])

1.3 元素访问

  • d[key]
    返回key对应的值Value
    key不存在抛出KeyError异常
  • get(key[,default])
    返回key对应的值Value
    key不存在返回缺省值,如果没有设置缺省值就返回None
  • setdefault(key[,default])
    返回key对应的Value
    key不存在,添加kv对,value设置为default,并返回default,如果default没有设置,缺省为None
1
2
3
4
5
d = dict([('a', 100), ['b', 200], (1, 'abc')], b=300, c=400)
print(d['a'])
print(d.get('e', "key doesn't exist"))
print(d.setdefault('f', 'defaultValue'))
print(d)
1
2
3
4
100
key doesn't exist
defaultValue
{'a': 100, 'b': 300, 1: 'abc', 'c': 400, 'f': 'defaultValue'}

2.增删、遍历

2.1 新增和修改

  • d[key] = value
    将key对应的值修改为value
    key不存在添加新的kv对
  • update([other]) -> None
    使用另一个字典的kv对更新字本字典
    key不存在,就添加
    key存在,覆盖已经存在的key对应的值
    就地修改
1
2
3
4
5
d = {}
d['a'] = 1
d.update(red=1)
d.update({'red': 2})
print(d)

2.2 删除

  • pop(key[,default])
    key存在,移除它,并返回它的Value
    key不存在,返回给定的缺省值(default值)
    defualt未设置,key不存在抛出KeyError异常
  • popitem()
    移除并返回一个任意的键值对
    字典为empty,抛出KeyError
  • clear()
    清空字典
  • del a[key]
    语句删除某个kv对,a为字典
1
2
3
4
5
6
7
8
9
10
d = dict([('a', 100), ['b', 200], (1, 'abc'),(2,'def')], b=300, c=400)
print(d)
del d['a']
print(d)
d.pop('b')
print(d)
d.popitem()
print(d)
d.clear()
print(d)
1
2
3
4
5
{'a': 100, 'b': 300, 1: 'abc', 2: 'def', 'c': 400}
{'b': 300, 1: 'abc', 2: 'def', 'c': 400}
{1: 'abc', 2: 'def', 'c': 400}
{1: 'abc', 2: 'def'}
{}

注:在使用keys、values、items方法遍历的时候,不可以改变字典的大小,即不能直接删除,可以先将待移除keys保存在临时列表,遍历完字典后,再对这些keys做移除操作

1
2
3
4
5
6
7
8
9
d = dict([('a', 100), ['b', 200], (2, 'thanks'), ('d', 123), (1, 'abc')], b=300, c=400, e='hello')
delkeys = []
for k,v in d.items():
if isinstance(v,str):
print(k,v)
delkeys.append(k)
for k in delkeys:
d.pop(k)
print(d)

2.3 遍历

key、values、items方法返回一个类似生成器的可迭代对象

  • Dictionary view对象,可以使用len()、iter()、in操作
  • 字典的Jentry的动态的视图、字典变化、视图将反映出这些变化
  • keys返回一个类set对象,也就是可以看做一个set集合。如果values都可以hash,那么items也可以看做是类set对象
1
2
3
4
5
6
7
8
9
10
d = dict([('a', 100), ['b', 200], (1, 'abc')], b=300, c=400)
print("-------key--------")
for key in d.keys():
print(key)
print("------values------")
for values in d.values():
print(values)
print("------items-------")
for k,v in d.items():
print(k,v)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
-------key--------
a
b
1
c
------values------
100
300
abc
400
------items-------
a 100
b 300
1 abc
c 400

注意: 遍历出来的key与value看似有序,但并不是有序的,因为字典是无序的。字典Python3.6开始记录kv对中k的录入序,但不表示key是有序。set集合key没有记录这个顺序,不要依赖录入顺序,因为字典的kv对是无序的(hash生成),set一定是无序的

3.缺省字典与练习

3.1 缺省字典

1
2
3
4
5
6
from collections import defaultdict

d = defaultdict(list)
for k in 'abcd':
d[k].extend(range(3))
print(d)

返回值:
defaultdict(<class ‘list’>, {‘a’: [0, 1, 2], ‘b’: [0, 1, 2], ‘c’: [0, 1, 2], ‘d’: [0, 1, 2]})

1
2
3
4
5
6
7
8
9
from collections import defaultdict

d = {}
for k in 'abcd':
for v in range(3):
if k not in d.keys():
d[k]= []
d[k].append(v)
print(d)

返回值:
{‘a’: [0, 1, 2], ‘b’: [0, 1, 2], ‘c’: [0, 1, 2], ‘d’: [0, 1, 2]}

3.2 练习

1.用户输入一个数字

  • 打印每一位数字及其重复的次数
1
2
3
4
5
6
7
from collections import defaultdict
num = input('please input a number >> ').strip().lstrip('0')
d = defaultdict(int)
for k in num:
d[k] += 1
for k, v in d.items():
print('数字 {} 重复了 {} 次'.format(k,v))

2.数字重复统计

  • 随机产生100个整数
  • 数字的范围[-1000,1000]
  • 升序输出这些数字并打印其重复的次数
1
2
3
4
5
6
7
8
9
10
import random
from collections import defaultdict

d = defaultdict(int)
for i in range(100):
k = random.randint(-1000, 1000)
d[k] += 1
for j in sorted(d):
v = d[j]
print("数字 {} 重复了 {} 次".format(j, v))

3.字符串重复统计

  • 字符表abcdefghijklmnopqrstuvwxyz随机挑选2个字母组成字符串
  • 共挑选100个降序输出所有不同的字符串及重复的次数
1
2
3
4
5
6
7
8
import random
from collections import defaultdict
d = defaultdict(int)
for i in range(100):
d[chr(random.randint(97, 122)) + chr(random.randint(97, 122))] += 1
for j in sorted(d, reverse=True):
v=d[j]
print('单词 {} 重复了 {} 次'.format(j, v))