我需要传入元组的所有值来索引字典吗?

2024-06-16 09:38:15 发布

您现在位置:Python中文网/ 问答频道 /正文

使用Python,我创建了一个由元组索引的列表:

return values[(a, b)]

但是,有时我想传入(a, _),在那里我不关心b的值是多少,并接收所有可能索引的列表。你知道吗

例如:

values[(dog, _)] => returns [(dog, Mike), (dog, Sam), (dog, Edward)]

这在Python中是可能的吗?你知道吗


Tags: 列表returnsamreturnsmike元组valuesedward
3条回答

如果您有一个元组列表,那么您可以简单地从元组列表创建一个字典,并将第一个元素用作dict键,如下所示:

>>> import collections
>>> l = [('a', 'foo'), ('a', 'bar'), ('b', 'hello')]
>>> d = collections.defaultdict(list)
>>> for k, v in l:
...   d[k].append(v)
... 
>>> d
defaultdict(<type 'list'>, {'a': ['foo', 'bar'], 'b': ['hello']})
>>> d['a']
['foo', 'bar']

不能用元组键对字典进行部分索引。必须使用与插入数据相同的密钥来提取数据。你知道吗

但是,另一种方法是使用嵌套字典。也就是说,与使用单个元组(values[key1,key2])进行索引不同,您需要索引两次values[key1][key2]。如果只提供第一个键,则会得到一个包含数据的内部字典。你知道吗

举个例子:

>>> d = {1: {1: 2, 2: 3, 3: 4}, 2: {2: 1, 3: 2, 4: 3}}
>>> d[1][1]
2
>>> d[1]
{1: 2, 2: 3, 3: 4}

如果只需要其中一个内部字典的值,可以使用values方法获取:

>>> d[1].values()
dict_values([2, 3, 4])

在python3中,dict.values返回一个“view”对象,它是iterable。如果您需要一个真正的列表,只需将values调用包装到list构造函数中即可(请注意,值的顺序是任意的):

>>> list(d[1].values())
[2, 3, 4]

必须使用键的精确值来索引词典。你知道吗

要查找多个键,需要在它们上循环:

[k for k in my_dict if k[0] == dog]

相关问题 更多 >