具有元组键的字典:所有具有相同第一个元素的元组

时间:2018-12-23 19:22:10

标签: python search tuples key

我在python中有字典,其键是元组,例如:

my-dict={(1,'a'):value1, (1,'b'):value2, (1,'c'):value3, (2,'a'):value4, 
(2,'b'):value5,(3,'a'):value6}

我需要访问其键具有相同第一个参数的所有值。例如,我需要访问

{(1,'a'):value1, (1,'b'):value2, (1,'c'):value3}  

因为它们所有人都有1作为元组键的第一个元素。一种方法是使用forif

for key in my-dict:
    if key[0]==1:
       do something

但是,我的实际字典和数据非常庞大,这种方法需要很多时间。还有其他有效方法吗?

2 个答案:

答案 0 :(得分:2)

如果您必须再次搜索所有字典键,则会失去创建字典的好处。一个好的解决方案是创建另一个字典,该字典包含以正确的第一个元素开头的所有键。

my_dict={(1,'a'):'value1', (1,'b'):'value2', (1,'c'):'value3', (2,'a'):'value4', 
(2,'b'):'value5',(3,'a'):'value6'}

from collections import defaultdict

mapping = defaultdict(list) #You do not need a defaultdict per se, i just find them more graceful when you do not have a certain key.

for k in my_dict:
    mapping[k[0]].append(k)

映射现在看起来像这样:

defaultdict(list,
            {1: [(1, 'a'), (1, 'b'), (1, 'c')],
             2: [(2, 'a'), (2, 'b')],
             3: [(3, 'a')]})

现在,只需使用字典来查找原始字典中所需的键。

first_element = 1
#Now just use the lookup to do some actions
for key in mapping[first_element]:
    value = my_dict[key]
    print(value)
    #Do something

输出:

value1
value2
value3

答案 1 :(得分:1)

dict内置类型将可哈希值映射到任意对象。在您的字典中,元组(1, 'a')(1, 'b')等都有不同的哈希值。

您可以尝试使用Pandas multi-indexes完成此操作。 Here是一个很好的例子。

或者,如注释之一所示,嵌套字典在这里可能更合适。您可以通过{p>从my_dict进行转换

from collections import defaultdict

nested_dict = defaultdict(dict)  # not necessary, but saves a line
for tup_key, value in my_dict.items():
    key1, key2 = tup_key
    nested_dict[key1][key2] = value

然后像nested_dict[1]这样的东西会给您

{'a':value1, 'b':value2, 'c':value3}