将数字列表映射到具有多个值的字典键

时间:2019-02-27 06:52:53

标签: python

我将从一个例子开始。假设我有一本字典,例如:

d = {1:['A','B'],
     2:['C']}

和一个列表:

vals = [1,2]

我想将列表(值)中的这些值映射到字典(d)中所有可能的值。所以这里的输出应该是两个列表,例如:

[[ 'A','C']['B','C']]

这基本上是我现在面临的问题。我以为可以通过for循环来做到这一点,但是当我们面对这个字典和值列表时,我无法使用for循环甚至嵌套循环来实现它:

d = {1:['A','B','C'] ,
     2:['D','E'],
     3:['F','G'],
     4:['I'] }

values = [1,2,3,4]

此处的输出应为:

[['A', 'D', 'F', 'I'], 
 ['A', 'D', 'G', 'I'],
 ['A', 'E', 'F', 'I'], 
 ['A', 'E', 'G', 'I'],
 ['B', 'D', 'F', 'I'], 
 ['B', 'D', 'G', 'I'],
 ['B', 'E', 'F', 'I'],
 ['B', 'E', 'G', 'I'], 
 ['C', 'D', 'F', 'I'],
 ['C', 'D', 'G', 'I'],
 ['C', 'E', 'F', 'I'],
 ['C', 'E', 'G', 'I']]

2 个答案:

答案 0 :(得分:2)

您可以为此使用itertools product()。只需理解要包含的索引,然后将它们传递给product()。如果您对元组没问题,那将是一个不错的选择:

import itertools

list(itertools.product(*(d[x] for x in values)))

结果:

[('A', 'D', 'F', 'I'),
 ('A', 'D', 'G', 'I'),
 ('A', 'E', 'F', 'I'),
 ('A', 'E', 'G', 'I'),
 ('B', 'D', 'F', 'I'),
 ('B', 'D', 'G', 'I'),
 ('B', 'E', 'F', 'I'),
 ('B', 'E', 'G', 'I'),
 ('C', 'D', 'F', 'I'),
 ('C', 'D', 'G', 'I'),
 ('C', 'E', 'F', 'I'),
 ('C', 'E', 'G', 'I')]

答案 1 :(得分:0)

如果您简单地需要解决方案,请使用 Mark Meyer ,但是如果您想知道它是否可以通过for s来执行,请按照以下方式回答:

d = {1:['A','B','C'] ,2:['D','E'],3:['F','G'],4:['I']}
for k in sorted(d.keys())[:-1][::-1]:
    d[k] = [(i+j) for i in d[k] for j in d[k+1]]
out = [tuple(i) for i in d[1]]
print(out)

给予:

[('A', 'D', 'F', 'I'), ('A', 'D', 'G', 'I'), ('A', 'E', 'F', 'I'), ('A', 'E', 'G', 'I'), ('B', 'D', 'F', 'I'), ('B', 'D', 'G', 'I'), ('B', 'E', 'F', 'I'), ('B', 'E', 'G', 'I'), ('C', 'D', 'F', 'I'), ('C', 'D', 'G', 'I'), ('C', 'E', 'F', 'I'), ('C', 'E', 'G', 'I')]

请注意,该解决方案假定字典d是正确的,即其键是从1开始的后续数字,并且所有值都是一个字母list的{​​{1}} s。现在说明:外部str正在处理从第二大到for的数字,在这种特殊情况下,降序为:132。列表理解使第1个列表与第SQL CROSS JOIN个列表的“每对每个”联接(如k),并且效果存储在当前键{{1}下}。 最后,我检索(k+1)k的{​​{1}},并将其转换为符合要求的d[1]中的list。如果您不清楚此解决方案的工作方式,请复制代码段,在str下添加list ...,然后观察其打印内容。