【问题标题】:Generate combinations (in specific order) by using one item per list in Python?通过在 Python 中的每个列表使用一项来生成组合(按特定顺序)?
【发布时间】:2014-09-17 09:54:15
【问题描述】:

我有一个相当复杂的问题(或者在我看来是这样)。我有一本字典,其中包含元素的键编辑列表和该字典的键列表

numbers = { 
            'group1': [1, 2],
            'group2': [3, 4],
            'group3': [5, 6]
          }
order   = [ 'group1', 'group2', 'group3' ]

我想按照给定的顺序使用每组一个数字来生成组合。所以我希望得到[ 'group1', 'group2', 'group3' ] 的订单

1, 3, 5
1, 3, 6
1, 4, 5
1, 4, 6
2, 3, 5
2, 3, 6
2, 4, 5
2, 4, 6

我有一个解决方案,但它不够通用且无法扩展:

group1=order[0]
group2=order[1]
group3=order[2]
for n in numbers[group1]:
    for n2 in numbers[group2]:
        for n3 in numbers[group3]:
            print(n, n2, n3)

有任何更智能的解决方案适用于任意数量的组吗?

【问题讨论】:

    标签: python-2.7 dictionary combinations combinatorics


    【解决方案1】:

    您可以结合使用itertools.productlist comprehension 和元组解包:

    import itertools
    
    for ns in itertools.product(*[numbers[g] for g in order]):
        print(*ns) # or 'print ns' for 2.x
    

    这给了我你正在寻找的结果:

    1 3 5
    1 3 6
    1 4 5
    1 4 6
    2 3 5
    2 3 6
    2 4 5
    2 4 6
    

    【讨论】:

    • 这些星号是干什么用的?
    • 值得注意的是 print(*ns) 不适用于 python2.x。请改用print(ns)
    • 如果您使用的是 Python 2.x,print 是一个语句,而不是一个函数 - 使用 print ns。另外,请用适当的版本标记您的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-21
    • 2016-03-01
    • 1970-01-01
    • 2021-07-21
    • 1970-01-01
    相关资源
    最近更新 更多