Словарь с ключом кортежей: все кортежи с одинаковым первым элементом - PullRequest
0 голосов
/ 23 декабря 2018

У меня есть словарь в 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 в качестве первого элемента ключа кортежа.Одним из способов является использование for и if:

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

Однако мой фактический словарь и данные очень велики, и этот метод занимает много времени.Есть ли другой способ эффективно сделать это?

Ответы [ 2 ]

0 голосов
/ 23 декабря 2018

Вы теряете преимущества создания словаря, если вам придется снова искать все его ключи.Хорошим решением было бы создать еще один словарь, содержащий все ключи, начинающиеся с правильного первого элемента.

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
0 голосов
/ 23 декабря 2018

Встроенный тип dict отображает допустимые значения для произвольных объектов.В вашем словаре кортежи (1, 'a'), (1, 'b') и т. Д. Имеют разные хэши.

Вы можете попробовать использовать Pandas multi-indexes для достижения этой цели. Здесь является хорошим примером.

В качестве альтернативы, как один из предложенных комментариев, здесь может быть более подходящим вложенный словарь.Вы можете преобразовать его из 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}  
...