我想知道为什么当我使用list(dictionary)时,它仅将键而不是键的定义返回到列表中?
例如,我使用CSV阅读器将包含术语和定义的词汇表导入字典,然后使用内置的list()函数将字典转换为列表,并且仅返回列表中的键。
这并不是真正的问题,因为它实际上使我的程序能够很好地工作,只是想知道这是应该如何表现的?
非常感谢您的帮助。
答案 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
将会失败。