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 实现全排列和任意排列 这篇文章一样

扩展资料

       如果想进一步了解视图对象是什么,为什么要用视图对象,视图对象有什么好处等,可以参考如下链接

      大概的意思使用 视图对象,你可以迭代实际的数据结构,而无需中间列表,加快速度的人同时降低内存开销。

      视图对象存储对 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]

posted on 2021-06-09 19:46  雾恋过往  阅读(519)  评论(0编辑  收藏  举报

Live2D