获取字典中元素的组合

时间:2013-11-26 07:33:05

标签: python math

我的字典看起来像这样:

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

2 个答案:

答案 0 :(得分:3)

好。我理解这个问题并纠正了我的答案。

使用list comprehension

制作值列表
>>> 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]

之后,它会获取每个列表的第一个元素并将其放在一个新列表(组合)中,并对其余元素执行相同的操作。