说明
《Python 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
在 Python 中,字典视图对象是字典的动态视图,它们提供了对字典中键和值的动态视图。由 dict.keys(), dict.values() 和 dict.items() 所返回的对象是 视图对象。 该对象提供字典条目的一个动态视图,这意味着当字典改变时,视图也会相应改变。
有三种类型的字典视图对象:
字典视图对象是动态的,这意味着它们会随着字典的变化而变化。如果字典发生了更改(添加、删除或修改键值对),相应的字典视图也会反映这些变化。
字典视图可以被迭代以产生与其对应的数据,并支持成员检测:
len(dictview)
返回字典中的条目数。iter(dictview)
返回字典中的键、值或项(以 (键, 值) 为元素的元组表示)的迭代器。键和值是按插入时的顺序进行迭代的。 这样就允许使用 zip() 来创建 (值, 键) 对: pairs = zip(d.values(), d.keys())。 另一个创建相同列表的方式是 pairs = [(v, k) for (k, v) in d.items()]
。在添加或删除字典中的条目期间对视图进行迭代可能引发 RuntimeError 或者无法完全迭代所有条目。在 3.7 版本发生变更: 字典顺序会确保为插入顺序。x in dictview
如果 x 是对应字典中存在的键、值或项(在最后一种情况下 x 应为一个 (键, 值) 元组) 则返回 True。reversed(dictview)
返回一个逆序获取字典键、值或项的迭代器。 视图将按与插入时相反的顺序进行迭代。在 3.8 版本发生变更: 字典视图现在是可逆的。dictview.mapping
返回 types.MappingProxyType 对象,封装了字典视图指向的原始字典。在 3.10 版本加入。键视图与集合类似因为其条目是唯一的并且为 hashable。 条视图也有类似集合的操作因为 (键, 值) 对是唯一的并且键是可哈希的。 如果条目视图中的所有值也都是可哈希的,那么条目视图就可以与其他集合执行互操作。 (值视图不会被认为与集合类似因为条目通常不是唯一的)。 对于与集合类似的视图,可以使用为抽象基类 collections.abc.Set 定义的所有操作(例如,==, < 或 ^ 等)。 虽然使用了集合运算符,但与集合类似的视图接受任何可迭代对象作为其操作数,而不像集合那样只接受集合作为输入。
一个使用字典视图的示例:
dishes = {'eggs': 2, 'sausage': 1, 'bacon': 1, 'spam': 500}
keys = dishes.keys()
values = dishes.values()
# iteration
n = 0
for val in values:
n += val
print(n)
# 504
# keys and values are iterated over in the same order (insertion order)
list(keys)
# ['eggs', 'sausage', 'bacon', 'spam']
list(values)
# [2, 1, 1, 500]
# view objects are dynamic and reflect dict changes
del dishes['eggs']
del dishes['sausage']
list(keys)
# ['bacon', 'spam']
# set operations
keys & {'eggs', 'bacon', 'salad'}
# {'bacon'}
keys ^ {'sausage', 'juice'} == {'juice', 'sausage', 'bacon', 'spam'}
# True
keys | ['juice', 'juice', 'juice'] == {'bacon', 'spam', 'juice'}
# True
# get back a read-only proxy for the original dictionary
values.mapping
mappingproxy({'bacon': 1, 'spam': 500})
values.mapping['spam']
# 500
字典会保留插入时的顺序。 请注意对键的更新不会影响顺序。 删除并再次添加的键将被插入到末尾。
d = {"one": 1, "two": 2, "three": 3, "four": 4}
d
# {'one': 1, 'two': 2, 'three': 3, 'four': 4}
list(d)
# ['one', 'two', 'three', 'four']
list(d.values())
# [1, 2, 3, 4]
d["one"] = 42
d
# {'one': 42, 'two': 2, 'three': 3, 'four': 4}
del d["two"]
d["two"] = None
d
# {'one': 42, 'three': 3, 'four': 4, 'two': None}
在 3.7 版本发生变更: 字典顺序会确保为插入顺序。 此行为是自 3.6 版开始的 CPython 实现细节。
字典和字典视图都是可逆的。
d = {"one": 1, "two": 2, "three": 3, "four": 4}
d
# {'one': 1, 'two': 2, 'three': 3, 'four': 4}
list(reversed(d))
# ['four', 'three', 'two', 'one']
list(reversed(d.values()))
# [4, 3, 2, 1]
list(reversed(d.items()))
# [('four', 4), ('three', 3), ('two', 2), ('one', 1)]
在 3.8 版本发生变更: 字典现在是可逆的。
types.MappingProxyType 可被用来创建一个 dict 的只读视图。
更新时间:2024-03-01 08:32:36 标签:python 字典 视图