我的字典看起来像这样:
a: [a]
b: [b, c]
c: [d, e, f]
事先知道每个列表中的键数和元素数。
我希望能够获得每个列表中元素的所有可能组合。上面字典的输出将是这样的:
[a, d, b]
[a, e, c]
[a, f, b]
[a, d, c]
[a, e, b]
[a, f, c]
列表中的列表和列表中列表中的元素(这是一个满口的)并不重要。
我尝试了一个解决方案,我已经发布了答案,但我很想知道是否有更有效的解决方案。
编辑:只能从字典中的每个键中获取一个元素。按照上面的示例,您[b d e]
d e
的{{1}}来自c
。
答案 0 :(得分:3)
好。我理解这个问题并纠正了我的答案。
制作值列表>>> d = {"a": [1], "b": [2,3], "c": [4,5,6]}
>>> values = [v for k,v in d.items()]
>>> values
[[1], [4, 5, 6], [2, 3]]
然后使用等同于for-loop的itertools.product。
>>> for i in itertools.product(*l):
... print i
...
(1, 4, 2)
(1, 4, 3)
(1, 5, 2)
(1, 5, 3)
(1, 6, 2)
(1, 6, 3)
答案 1 :(得分:0)
我想出了这个:
def _gcd(a, b):
while b:
a, b = b, a % b
return a
def _lcm(a, b):
return a * b // _gcd(a, b)
def lcm(numbers):
return reduce(_lcm, numbers)
def combinations(dict):
lengths = []
for key in dict.keys():
lengths.append(len(dict[key]))
lcm_int = lcm(lengths)
for key in dict.keys():
values = []
length = len(dict[key])
for i in range(lcm_int):
values.append(dict[key][i%length])
dict[key] = values
combinations = []
for i in range(lcm_int):
values = []
for key in dict.keys():
values.append(dict[key][i])
combinations.append(values)
return combinations
此代码查找字典中所有列表长度的LCM。然后它将每个列表扩展为如下所示:
[a] -> [a, a, a, a, a, a]
[b, c] -> [b, c, b, c, b, c]
[d, e, f] -> [d, e, f, d, e, f]
之后,它会获取每个列表的第一个元素并将其放在一个新列表(组合)中,并对其余元素执行相同的操作。