字典实战——在Python 3.X 和 2.7 中的字典改变——字典视图和sets

未匹配的标注

也不像 2.X列表结果,被keys方法返回的3.X视图对象是类set的,且支持如交集和并集等常用集合操作;values视图不是类set的,但如果items(key,value)对是独特且可哈希的(不可变的),则其结果是类set的。考虑到sets表现得很像无值的字典(且在3.X和2.7中甚至可能被编码在像字典的花括号中),这是一个逻辑的对称性。根据第5章,set项是无序的、独立的和不可变的,就像字典键一样。

下面是当用在集合操作(从前一节的会话开始)中时, keys视图看起来的样子;字典的值视图从不是类set的,因为它们的项目不一定独特或不可变:

>>> K, V
(dict_keys(['c', 'a']), dict_values([3, 1]))
>>> K | {'x': 4} # Keys (and some items) views are set-like
{'c', 'x', 'a'}
>>> V & {'x': 4}
TypeError: unsupported operand type(s) for &: 'dict_values' and 'dict'
>>> V & {'x': 4}.values()
TypeError: unsupported operand type(s) for &: 'dict_values' and
'dict_values'

在set操作中,视图可能和其它视图、sets和字典混合;字典在这个上下文中的处理方式和它们的键视图一样:

>>> D = {'a': 1, 'b': 2, 'c': 3}
>>> D.keys() & D.keys() # Intersect keys views
{'b', 'c', 'a'}
>>> D.keys() & {'b'} # Intersect keys and set
{'b'}
>>> D.keys() & {'b': 1} # Intersect keys and dict
{'b'}
>>> D.keys() | {'b', 'c', 'd'} # Union keys and set
{'b', 'c', 'a', 'd'}

如果项目视图可以哈希,它们也是类set的——也就是说,如果它们只包含不可变的对象:

>>> D = {'a': 1}
>>> list(D.items()) # Items set-like if hashable
[('a', 1)]
>>> D.items() | D.keys() # Union view and view
{('a', 1), 'a'}
>>> D.items() | D # dict treated same as its keys
{('a', 1), 'a'}
>>> D.items() | {('c', 3), ('d', 4)} # Set of key/value pairs
{('d', 4), ('a', 1), ('c', 3)}
>>> dict(D.items() | {('c', 3), ('d', 4)}) # dict accepts iterable sets too
{'c': 3, 'a': 1, 'd': 4}

如果需要关于这些操作的复习,请参阅第5章的sets操作的讲述。这里,让我们使用3.X字典其它三个快速编码说明来完成。

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
讨论数量: 0
发起讨论 查看所有版本


暂无话题~