2013-07-19 3 views
0

У меня есть несколько defaultdict который выглядит следующим образом:Получение значения многих defaultdicts, которые содержат определенный ключ

en1 = {1:['handler', 'coach', 'manager'],2:['a','c']} 
es2 = {1:['entrenador', 'míster', 'entrenadora'],2:['h','i'],4:['j','k','m']} 
it3 = {1:['mister', 'allenatore' 'coach'],3:['p','q'],5:['r','q']} 
... 

И мне нужно получить строку из каждого defaultdict обмена тот же индекс. Что-то вроде этого:

for i in en1: 
    for j in en1[i]: 
    for k in es2[i]: 
     for l in it3[i]: 
     print j, k, l 

, но я должен сделать это для как 30+ defaultdict, так как это может быть сделано без написать эту ужасающую петлю выше?

Есть ли способ получить все значения defaultdict с теми же ключами, а затем легко получить значения?

Необходимо выходные комбинации кортежей из значений, разделяющих один и тот же ключ для всех dicts, например:

handler entrenador mister 
handler entrenador allenatore 
handler entrenador coach 
handler mister mister 
handler mister allenator 
... 
+2

Почему бы не сохранить все эти словари в списке или словаре вместо использования локальных переменных с инкрементальными именами? –

+0

, потому что они поступали из нескольких разных входов. Если я храню их как список словарей, есть ли способ легко получить доступ к различным значениям defaultdict с помощью одного и того же ключа? – alvas

+0

Да. Многое, намного проще. – user2357112

ответ

3

Начните с использованием списка словарей вместо 30 отдельных переменных:

dd = [{1: ['a', 'b'], 2: ['a', 'c'], 3: ['d', 'e']}, {1: ['f', 'g', 'l'], 2: ['h', 'i'], 4: ['j', 'k', 'm']}, ...] 

И используйте itertools.product() для генерации всех комбинаций между соответствующими списками:

from itertools import product 

for key in dd[0]: 
    for combination in product(*(d[key] for d in dd)): 
     print ' '.join(combination) 

Здесь выражение генератора извлекает один и тот же ключ из всех словарей в одном выражении.

Выход для ввода образца; обратите внимание, что нет dd2[3] и нет dd3[2], поэтому для ключей 2 и 3 не генерируется выход.

>>> for key in dd[0]: 
...  for combination in product(*(d[key] for d in dd)): 
...   print ' '.join(combination) 
... 
handler entrenador mister 
handler entrenador allenatorecoach 
handler míster mister 
handler míster allenatorecoach 
handler entrenadora mister 
handler entrenadora allenatorecoach 
coach entrenador mister 
coach entrenador allenatorecoach 
coach míster mister 
coach míster allenatorecoach 
coach entrenadora mister 
coach entrenadora allenatorecoach 
manager entrenador mister 
manager entrenador allenatorecoach 
manager míster mister 
manager míster allenatorecoach 
manager entrenadora mister 
manager entrenadora allenatorecoach 

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

+0

Примечание. Даже если в каждом списке всего 2 значения, этот цикл будет составлять миллиард итераций. Возможно, лучше избегать необходимости в этом цикле. – user2357112

+0

@ user2357112: Абсолютно, но OP не заявляет, что цель цели, поэтому пока мы можем только помочь ему с нажатием спускового крючка.Если пушка нацеливается на ногу, пусть будет так! –

+0

'комбинация' не дает правильный выход. – alvas

0

Я не уверен, что я понимаю ваши ожидания относительно вывода, («строка из каждого значения по умолчанию, использующего один и тот же индекс»?). Вывод образца содержит элементы, которые не имеют одного и того же индекса, например aga, g имеет вторую позицию в dd2 key1), но это даст вам словарь, содержащий слитые значения элементов с одинаковым ключом внутри всех три dicts:

d1 = {1:['a','b'],2:['a','c'],3:['d','e']} 
d2 = {1:['f','g','l'],2:['h','i'],4:['j','k','m']} 
d3 = {1:['n','a'],3:['p','q'],5:['r','q']} 

d4 = [d1,d2,d3] 
new = {} 
for i in d4: 
    for m in i: 
     try: 
      new[m].extend(i[m]) 
     except: 
      new[m] = [] 
      new[m].extend(i[m]) 
print new 
{1: ['a', 'b', 'f', 'g', 'l', 'n', 'a'], 
2: ['a', 'c', 'h', 'i'], 3: ['d', 'e', 'p', 'q'], 
4: ['j', 'k', 'm'], 5: ['r', 'q']} 

И тогда вы можете сделать еще один список, содержащие комбинации всех элементов в этих списках, если вы нуждаетесь в них.

from itertools import combinations 
combs = [] 
#this is just for one key, but you can loop over list of dicts to do this for each dict 
for m in combinations(new[1],3): 
    perms.append(m) 
print combs 
[('a', 'b', 'f'), ('a', 'b', 'g'), ('a', 'b', 'l'), ('a', 'b', 'n'), ('a', 'b', 'a'), ('a', 'f', 'g'), ('a', 'f', 'l'), ('a', 'f', 'n'), ('a', 'f', 'a'), ('a', 'g', 'l'), ('a', 'g', 'n'), ('a', 'g', 'a'), ('a', 'l', 'n'), ('a', 'l', 'a'), ('a', 'n', 'a'), ('b', 'f', 'g'), ('b', 'f', 'l'), ('b', 'f', 'n'), ('b', 'f', 'a'), ('b', 'g', 'l'), ('b', 'g', 'n'), ('b', 'g', 'a'), ('b', 'l', 'n'), ('b', 'l', 'a'), ('b', 'n', 'a'), ('f', 'g', 'l'), ('f', 'g', 'n'), ('f', 'g', 'a'), ('f', 'l', 'n'), ('f', 'l', 'a'), ('f', 'n', 'a'), ('g', 'l', 'n'), ('g', 'l', 'a'), ('g', 'n', 'a'), ('l', 'n', 'a')] 

список длинный.

+0

nope. Мне нужен вывод, который будет указан в вопросе. – alvas

+0

Я отредактировал свой ответ, но, честно говоря, я не знаю, что вы хотите, чтобы результат выборки был не очень ясным. –