0

我有几个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']}
...

我需要从每个共享相同索引的默认字典中获取字符串。像这样的东西:

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 的所有值,然后轻松输出这些值?

它应该输出由对 all 共享相同键的值组成的元组组合dicts,例如:

handler entrenador mister
handler entrenador allenatore
handler entrenador coach
handler mister mister
handler mister allenator
...
4

2 回答 2

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]和 no 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 个不同的列表中生成产品将需要一段时间。您可能必须重新考虑您正在尝试做的事情,并避免做太多的工作。

于 2013-07-19T14:43:48.527 回答
0

我不确定我是否理解您对输出的期望,(“来自每个 defaultdict 的字符串共享相同的索引”?您的示例输出包含不共享相同索引的项目,例如 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')]

清单很长。

于 2013-07-19T14:49:56.307 回答