获取包含特定键的许多默认值的值

时间:2013-07-19 14:38:10

标签: python dictionary key defaultdict

我有几个defaultdict看起来像这样:

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 :(得分: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个不同的列表中生产产品需要一段时间。你可能不得不重新考虑你要做的事情,避免做太多的工作。

答案 1 :(得分:0)

我不确定我是否理解您对输出的期望,(“每个defaultdict共享相同索引的字符串”?您的示例输出包含不共享相同索引的项目,例如aga,g在dd2 key1中具有第二个位置)但这将为您提供包含所有三个词组中具有相同键的项目的融合值的字典:

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')]

列表很长。