键视图对象

字典的keys()方法返回一个所有键集合的键视图对象。键视图的一个很少被了解的特性就是它们也支持集合操作,比如集合并、交、差运算。所以,如果你想对集合的键执行一些普通的集合操作,可以直接使用键视图对象而不用先将它们转换成一个set。

例如:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
a = { 'x' : 1, 'y' : 2, 'z' : 3 }
b = { 'w' : 10, 'x' : 11, 'y' : 2 }

print(type(a.keys()))
print(type(b.keys()))

print(a.keys() & b.keys()) # 交集 {'y', 'x'}
print(a.keys() | b.keys()) # 并集 {'y', 'z', 'x', 'w'}
print(a.keys() - b.keys()) # 差集 {'z'}
print(b.keys() - a.keys()) # 差集 {'w'}
print(a.keys() ^ b.keys()) # 对称差集 {'z', 'w'}

执行以上程序会输出如下结果:

1
2
3
4
5
6
7
<class 'dict_keys'>
<class 'dict_keys'>
{'y', 'x'}
{'y', 'z', 'x', 'w'}
{'z'}
{'w'}
{'z', 'w'}

字典项视图对象

字典的items()方法返回一个包含 (键,值) 对的字典项视图对象。这个对象同样也支持集合操作,并且可以被用来查找两个字典有哪些相同的键值对。

例如:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
a = { 'x' : 1, 'y' : 2, 'z' : 3 }
b = { 'w' : 10, 'x' : 11, 'y' : 2 }

print(type(a.items()))
print(type(b.items()))

print(a.items() & b.items()) # 交集 {('y', 2)}
print(a.items() | b.items()) # 并集 {('y', 2), ('x', 1), ('z', 3), ('x', 11), ('w', 10)}
print(a.items() - b.items()) # 差集 {('x', 1), ('z', 3)}
print(b.items() - a.items()) # 差集 {('x', 11), ('w', 10)}
print(a.items() ^ b.items()) # 对称差集 {('x', 1), ('z', 3), ('x', 11), ('w', 10)}

执行以上程序会输出如下结果:

1
2
3
4
5
6
7
<class 'dict_items'>
<class 'dict_items'>
{('y', 2)}
{('y', 2), ('x', 1), ('z', 3), ('x', 11), ('w', 10)}
{('x', 1), ('z', 3)}
{('x', 11), ('w', 10)}
{('x', 1), ('z', 3), ('x', 11), ('w', 10)}

值视图对象

尽管字典的values()方法也是类似,返回一个展现值集合的值视图对象。但是它并不支持集合操作。某种程度上是因为值视图不能保证所有的值互不相同,这样会导致某些集合操作会出现问题。不过,如果你硬要在值上面执行这些集合操作的话,你可以先将值集合转换成set,然后再执行集合运算就行了。

例如:

1
2
3
4
5
a = { 'x' : 1, 'y' : 2, 'z' : 3 }
b = { 'w' : 10, 'x' : 11, 'y' : 2 }

print(type(a.values()))
print(type(b.values()))

执行以上程序会输出如下结果:

1
2
<class 'dict_values'>
<class 'dict_values'>

转载请注明本网址。