【3】数据结构之字典、集合

字典
字典可能是Python最为重要的数据结构。它更为常见的名字是哈希映射或关联数组。它是键值对的大小可变集合,键和值都是Python对象。创建字典的方法之一是使用尖括号,用冒号分割键和值,

empty_dict={
     }
d1={
     'a':'some value','b':[1,2,3,4]}
d1
{
     'a': 'some value', 'b': [1, 2, 3, 4]}

你可以像访问列表或元组中的元素一样,访问、插入或设定字典中的元素,

d1[7]='an integer'
d1
{
     'a': 'some value', 'b': [1, 2, 3, 4], 7: 'an integer'}
d1['b']
[1, 2, 3, 4]

可以使用检查列表和元组是否包含某个值的方法,检查字典中是否包含某个键,

'b' in d1
True

可以使用del关键字或pop方法(返回值的同事删除键)删除值,

d1[5]='some value'
d1
{
     'a': 'some value', 'b': [1, 2, 3, 4], 7: 'an integer', 5: 'some value'}
d1['dummy']='another value'
d1
{
     'a': 'some value',
 'b': [1, 2, 3, 4],
 7: 'an integer',
 5: 'some value',
 'dummy': 'another value'}
del d1[5]
d1
{
     'a': 'some value',
 'b': [1, 2, 3, 4],
 7: 'an integer',
 'dummy': 'another value'}
ret=d1.pop('dummy')
ret
'another value'
d1
{
     'a': 'some value', 'b': [1, 2, 3, 4], 7: 'an integer'}

keys和values是字典的键和值的迭代器方法。虽然键值对没有顺序,这两个方法可以用相同的顺序输出键和值,

list(d1.keys())
['a', 'b', 7]
list(d1.values())
['some value', [1, 2, 3, 4], 'an integer']

用update方法将一个字典与另一个字典融合,

d1.update({
     'b':'foo','c':12})
d1
{
     'a': 'some value', 'b': 'foo', 7: 'an integer', 'c': 12}

update方法是原地改变字典,因此任何传递给update的键的旧的值都会被舍弃。

用序列创建字典
通常情况下,你可能会想将两个序列组合成字典,下面是一种写法,

mapping={
     }
for key,value in zip(key_list,value_list):
    mapping[key]=value

因为字典本质上是2元元组的集合,dict可以接受2元元组的列表,

mapping=dict(zip(range(5),reversed(range(5))))
mapping
{
     0: 4, 1: 3, 2: 2, 3: 1, 4: 0}

集合
集合是无序的不可重复的元素集合。你可以把它当做字典,但只有键没有值。可以使用两种方式创建集合:通过set函数或使用尖括号set语句,

set([2,2,2,1,3,3])
{
     1, 2, 3}
{
     2,2,2,1,3,3}
{
     1, 2, 3}

集合支持合并、交集、差分和对称差等数学集合运算,考虑两个示例集合,

a={
     1,2,3,4,5}
b={
     3,4,5,6,7,8}

合并是取两个集合中不重复的元素,可以使用union方法,或者|运算符,

a.union(b)
{
     1, 2, 3, 4, 5, 6, 7, 8}

交集的元素包含在两个集合中,可以用intersection或&运算符,

a.intersection(b)
{
     3, 4, 5}
a&b
{
     3, 4, 5}

所有逻辑集合操作都有另外原地实现的方法,它可以直接用结果替代集合的内容。对于大的集合,这么做效率更高,

c=a.copy()
c
{
     1, 2, 3, 4, 5}
b
{
     3, 4, 5, 6, 7, 8}
c|=b
c
{
     1, 2, 3, 4, 5, 6, 7, 8}

与字典类似,集合元素通常是不可变的。要获得类似列表的元素,必须转换成元组,

my_data=[1,2,3,4]
my_set={
     tuple(my_data)}
my_set
{
     (1, 2, 3, 4)}

你还可以检测一个集合是否是另一个集合的子集或父集,

a_set={
     1,2,3,4,5}
{
     1,2,3}.issubset(a_set)
True
a_set.issuperset({
     1,2,3})
True

集合内容相同时,集合才对等,

{
     1,2,3}=={
     3,2,1}
True

列表、集合和字典推导式
列表推导式是Python最受喜爱的特性之一。它允许用户方便的从一个集合过滤元素,形成列表,在传递参数的过程中还可以修改元素,filter条件可以被忽略,只留下表达式就行。例如,给定一个字符串列表,我们可以过滤出长度在2及以下的字符串,并将其转换成大写,

strings=['a','as','bat','car','dove','python']
[x.upper() for x in strings if len(x)>2]
['BAT', 'CAR', 'DOVE', 'PYTHON']

集合与字典的推到也很方便,而且使代码的读写都很容易。来看前面的字符串列表,假如我们只想要字符串的长度,用集合推导式的方法非常方便,

unique_lengths={
     len(x) for x in strings}
unique_lengths
{
     1, 2, 3, 4, 6}

map函数可以进一步简化,

set(map(len,strings))
{
     1, 2, 3, 4, 6}

你可能感兴趣的:(【3】数据结构之字典、集合)