python的字典的items(), keys(), values()
之前用过,但是没弄明白
只知道这三个东西返回的肯定是一个可迭代对象,但是具体是啥就不太清楚,基础知识不太扎实
今天写这篇文章 https://blog.csdn.net/qq_43657442/article/details/108338507时突然想到的,闲来有空便整理记录下
首先说结论
在 python2.X中 他们三个都返回一个list ,即返回值是一个列表
python2.7示例
a={'a':1,'b':2,'c':3,'d':4,'efg':567}
print(a.items())
print(a.keys())
print(a.values())
输出
[('a', 1), ('b', 2), ('c', 3), ('d', 4), ('efg', 567)]
['a', 'b', 'c', 'd', 'efg']
[1, 2, 3, 4, 567]
在 python3.X中 他们三个都返回一个 dict 对象的 视图
,都是 视图对象
python3.7示例
a={'a':1,'b':2,'c':3,'d':4,'efg':567}
print(a.items())
print(a.keys())
print(a.values())
输出
dict_items([('a', 1), ('b', 2), ('c', 3), ('d', 4), ('efg', 567)])
dict_keys(['a', 'b', 'c', 'd', 'efg'])
dict_values([1, 2, 3, 4, 567])
可以发现, items() 、keys()、values() 返回值的类型分别为 dict_items、dict_keys、dict_values 。并不像 python2.X 返回值是一个列表
视图对象是一个 iterable 对象
,它主要有三个特点:
- 第一,视图对象不是list,所以list方法对视图对象无法直接使用;
- 第二,视图对象动态跟踪字典的变化;
- 第三,对于dict.keys来说,返回的视图对象是一个 set-like(类似集合) 对象,因此可以使用 set 的方法来进行操作,但是,dict.values 返回的不是一个 set-like 的对象,因此无法使用 set 的方法来操作,这儿呢也好理解,键是独一无二的,但是值不是独一无二的(Set中的元素只会出现一次,即 Set 中的元素是唯一的)。 dict.items当且仅当包含唯一的<key, value>对,并且只包含不可变对象,那么它也是 set-like 的
对我来说,似乎只要知道他是一个 iterable 对象
就好了,把它作为参数带入到函数中达到我的目的,就比如 itertools 中的 permutations 实现全排列和任意排列 这篇文章一样
扩展资料
如果想进一步了解视图对象是什么,为什么要用视图对象,视图对象有什么好处等,可以参考如下链接
- https://www.thinbug.com/q/47273297
- https://kb.kutu66.com/others/post_13439649
- https://cloud.tencent.com/developer/ask/73833https://cloud.tencent.com/developer/ask/73833
大概的意思使用 视图对象,你可以迭代实际的数据结构,而无需中间列表,加快速度的人同时降低内存开销。
视图对象存储对 dict 的引用,并将视图上的操作转换为dict上的相应操作,直接遍历 dict 的底层存储,具体的原理可能要涉及到一些计算机底层的东西,我也不是很了解
当然,你要把 dict_items、dict_keys、dict_values 类型的变成 list 也简单,强制转换就好了
示例
a={'a':1,'b':2,'c':3,'d':4,'efg':567}
print(list(a.items()))
print(list(a.keys()))
print(list(a.values()))
输出
[('a', 1), ('b', 2), ('c', 3), ('d', 4), ('efg', 567)]
['a', 'b', 'c', 'd', 'efg']
[1, 2, 3, 4, 567]