3.1数据结构和序列(利用Python进行数据分析)
目录
- 4 字典
- 4.1 从序列生成字典
- 4.2 默认值
4 字典
dict(字典)可能是Python内建数据结构中最重要
的。
它更为常用的名字是哈希表
或者是关联数组
。字典是拥有灵活尺寸的键值对集合,其中键和值都是Python对象。用大括号 {} 是创建字典的一种方式,在字典中用逗号将键值对分隔:
empty_dict = {}
d1 = {'a' : 'some value', 'b' : [1, 2, 3, 4]}
print(d1)
Out[103]: {'a': 'some value', 'b': [1, 2, 3, 4]}
访问、插入或设置字典中的元素
In [104]: d1[7] = 'an integer'
In [105]: d1
Out[105]: {'a': 'some value', 'b': [1, 2, 3, 4], 7: 'an integer'}
In [106]: d1['b']
Out[106]: [1, 2, 3, 4]
检查字典是否含有一个键:
In [107]: 'b' in d1
Out[107]: True
使用del
关键字或pop
方法删除值,pop方法会在删除的同时返回被删的值,并删除键:
In [108]: d1[5] = 'some value'
In [109]: d1
Out[109]:
{'a': 'some value',
'b': [1, 2, 3, 4],
7: 'an integer',
5: 'some value'}
In [110]: d1['dummy'] = 'another value'
In [111]: d1
Out[111]:
{'a': 'some value',
'b': [1, 2, 3, 4],
7: 'an integer',
5: 'some value',
'dummy': 'another value'}
In [112]: del d1[5]
In [113]: d1
Out[113]:
{'a': 'some value',
'b': [1, 2, 3, 4],
7: 'an integer',
'dummy': 'another value'}
In [114]: ret = d1.pop('dummy')
In [115]: ret
Out[115]: 'another value'
In [116]: d1
Out[116]: {'a': 'some value', 'b': [1, 2, 3, 4], 7: 'an integer'}
keys
方法和values
方法会分别为你提供字典键、值的迭代器。然而键值对并没有特定的顺序,这些函数输出的键、值都是按照相同的顺序:
In [117]: list(d1.keys())
Out[117]: ['a', 'b', 7]
In [118]: list(d1.values())
Out[118]: ['some value', [1, 2, 3, 4], 'an integer']
使用update
方法将两个字典合并
:
In [119]: d1.update({'b' : 'foo', 'c' : 12})
In [120]: d1
Out[120]: {'a': 'some value', 'b': 'foo', 7: 'an integer', 'c': 12}
update方法改变了字典中元素位置,因此对于任何原字典中已经存在的键,如果传给update方法的数据也含有相同的键,则它的值将会被覆盖。
4.1 从序列生成字典
当有两个序列要在字典中按元素配对。
In [121]: mapping = dict(zip(range(5), reversed(range(5))))
In [122]: mapping
Out[122]: {0: 4, 1: 3, 2: 2, 3: 1, 4: 0}
4.2 默认值
通常情况下,会有这样的代码逻辑:
if key in some_dict:
value = some_dict[key]
else:
value = default_value
不过字典的get
方法和pop
方法可以返回一个默认值,因此上述的 if-else 代码块可以被简写为:
value = some_dict.get(key, default_value)
带有默认值的get方法会在key参数不是字典的键时返回None,而pop会抛出异常。一个常见的场景是字典中的值集合通过设置,成为另一种集合,比如列表。举个例子,你可以想象一下将字词组成的列表根据首字母分类为包含列表的字典:
In [123]: words = ['apple', 'bat', 'bar', 'atom', 'book']
In [124]: by_letter = {}
In [125]: for word in words:
.....: letter = word[0]
.....: if letter not in by_letter:
.....: by_letter[letter] = [word]
.....: else:
.....: by_letter[letter].append(word)
.....:
In [126]: by_letter
Out[126]: {'a': ['apple', 'atom'], 'b': ['bat', 'bar', 'book']}
字典的setdefault方法
就是为了这个目的而产生的。上述的for循环语句可以被写为:
for word in words:
letter = word[0]
by_letter.setdefault(letter, []).append(word)
内建的集合模块有一个非常有用的类,defaultdict。
这个类使得上述目的实现更为简单。想要生成符合要求的字典,你可以向字典中传入类型或能在各位置生成默认值的函数: