我将从一个例子开始。假设我有一本字典,例如:
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']]
答案 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
的数字,在这种特殊情况下,降序为:1
,3
,2
。列表理解使第1
个列表与第SQL CROSS JOIN
个列表的“每对每个”联接(如k
),并且效果存储在当前键{{1}下}。
最后,我检索(k+1)
中k
的{{1}},并将其转换为符合要求的d[1]
中的list
。如果您不清楚此解决方案的工作方式,请复制代码段,在str
下添加list
...,然后观察其打印内容。