为什么将字典转换为列表仅返回键?

时间:2019-08-04 13:24:08

标签: python

我想知道为什么当我使用list(dictionary)时,它仅将键而不是键的定义返回到列表中?

例如,我使用CSV阅读器将包含术语和定义的词汇表导入字典,然后使用内置的list()函数将字典转换为列表,并且仅返回列表中的键。

这并不是真正的问题,因为它实际上使我的程序能够很好地工作,只是想知道这是应该如何表现的?

非常感谢您的帮助。

4 个答案:

答案 0 :(得分:4)

您的意思是:

>>> d = {'a': [1, 2, 3], 'b': [4, 5, 6]}
>>> d.items()
dict_items([('a', [1, 2, 3]), ('b', [4, 5, 6])])
>>> list(d.items())
[('a', [1, 2, 3]), ('b', [4, 5, 6])]
>>> 

字典使list(d)给出密钥,而list(d.values())给出值。

此外,在documentation中:

  

在字典上执行list(d)会返回字典中使用的所有键的列表。

这可以告诉大家。

答案 1 :(得分:1)

  

为什么当我使用list(dictionary)时它仅返回键? ...只是想知道它应该如何表现?还是

Because that's how it's designed to work

  

在字典上执行list(d)会返回字典中使用的所有键的列表。

因为(推测):

  

对字典的主要操作是用一个键存储一个值并提取给定键的值。

不太重要。键是唯一的标识符。值映射到键。因此,字典是按键索引,按键迭代等等。如果要获取键/值元组的列表,则必须显式地调用它,例如list(d.items())

答案 2 :(得分:0)

字典可对其键值进行迭代,因此使用list()函数包装时,只能得到返回的键值。

行为将是这样的:

>>> dictionary = {'a': [1, 2, 3], 'b': [4, 5, 6]}
>>> dictionary.items()
dictionary_items([('item_1', [1, 2]), ('item_2', [3, 4])])

您可以使用dictionary.items()从字典中获取所有项(键和值)

>>> list(dictionary.items())
[('item_1', [1, 2]), ('item_2', [3, 4])]

答案 3 :(得分:0)

简而言之:从本质上讲,它是按这种方式工作的,因为它是按设计方式设计的。但是,如果考虑到x in some_dict对字典键执行成员检查,这是有道理的。


Python代码经常在集合上进行迭代,并且不知道其迭代的类型:它可以是列表,元组,集合,字典,范围对象等。

问题是,要做,我们将字典视为一个集合,如果是,则将什么的集合?如果要收集它,则对第二个问题基本上有三个逻辑答案:我们可以将其视为键,值或键-值对的集合。尤其是键和键值对很受欢迎。例如,C#将字典视为KeyValuePair<TK, TV>的集合。 Python提供了.values().items()方法来迭代值和键值对。

字典主要用于对键进行快速查找并检索相应的值。因此some_key in some_dict将是一个明智的查询,即(some_key, some_value) in some_dict,因为后者会检查密钥是否在字典中,然后检查其是否与some_value匹配。但是后者的灵活性较差,因为通常我们可能不想对相应的值感兴趣,因此我们只想检查字典是否包含某个键。此外,我们不能同时支持两个用例,因为如果字典例如包含2个元组作为键,那么这意味着如果(1, 2) in some_dict意味着对于键1的值是{ {1}};或2是字典中的键。

由于Python的设计者决定在键的字典上定义成员资格检查,因此使字典可迭代其键更有​​意义。确实,人们通常期望如果(1, 2)成立,那么x in some_iterable也应该成立。如果字典的可迭代性将返回键值对的2个元组(如C#一样),那么如果我们列出这些2个元组的列表,它将与字典本身的成员资格检查不一致。由于如果x in list(some_iterable)成立,则2 in some_dict将会失败。