【问题标题】:How to generate combinations with repetition of only one element using python如何使用python生成仅重复一个元素的组合
【发布时间】:2019-03-22 08:44:26
【问题描述】:

我是 Python 新手,刚刚遇到“itertools”模块。我想用多个列表创建这种特定类型的组合:

1) 重复后一个列表的第一个元素 2) 后一个值在组合内按升序排列

例如对于这两个列表

    a=[1,2,3]
    b=[None,4,5,6]

期望的结果是

    [(1, None), (2, None), (3, None)]
    [(1, None), (2, None), (3, 4)]
    [(1, None), (2, None), (3, 5)]
    [(1, None), (2, None), (3, 6)]
    [(1, None), (2, 4), (3, None)]
    [(1, None), (2, 4), (3, 5)]
    [(1, None), (2, 4), (3, 6)]
    [(1, None), (2, 5), (3, None)]
    [(1, None), (2, 5), (3, 6)]
    [(1, None), (2, 6), (3, None)]
    [(1, 4), (2, None), (3, None)]
    [(1, 4), (2, None), (3, 5)]
    [(1, 4), (2, None), (3, 6)]
    [(1, 4), (2, 5), (3, None)]
    [(1, 4), (2, 5), (3, 6)]
    [(1, 4), (2, 6), (3, None)]
    [(1, 5), (2, None), (3, None)]
    [(1, 5), (2, None), (3, 6)]
    [(1, 5), (2, 6), (3, None)]
    [(1, 6), (2, None), (3, None)]

即总共有 C(n+2,m) 个组合,其中 n=len(b) 和 m=len(a)。在这种情况下,有 C(4+2,3)=20 种组合。

我想知道是否有一种有效的方法可以使用“itertools”来获得结果。另外,请注意可能有 2 个以上的列表,例如可能有一个 c=[None,7,8,9,10],导致每个元组中有 3 个元素。

编辑: 我已经设法使用下面的代码获得了我想要的东西,尽管效率低下。如果您有更好的方法来解决此问题,请告诉我。谢谢:)

a=[1,2,3]
b=[4,5,6]
def create_none(lst):
    none_list=[]
    for Index in range(len(lst)):
        none_list.append(None)
    return none_list
extended_list=create_none(a)[:]
extended_list.extend(b)  

for i in itertools.combinations(extended_list,len(a)):
    sublist=list(zip(a,i))
    print(sublist)

【问题讨论】:

    标签: python


    【解决方案1】:

    itertools 模块中有一个函数:itertools.product。它完全满足您的需求。

    例子:

    a = [None,1,2]
    list(itertools.product(a, repeat=3))
    
    [(None, None, None),
     (None, None, 1),
     (None, None, 2),
     (None, 1, None),
     (None, 1, 1),
     (None, 1, 2),
     (None, 2, None),
     (None, 2, 1),
     (None, 2, 2),
     (1, None, None),
     (1, None, 1),
     (1, None, 2),
     (1, 1, None),
     (1, 1, 1),
    ...
    

    您的问题可以通过以下代码解决:

    [list(zip(a, elem))for elem in itertools.product(b, repeat=3)]

    【讨论】:

    • 您好,谢谢您的回答。但是,根据输出,每个组合内元组中的后一个值似乎不是按升序排列的。此外,列表 b 中的每个元素似乎都重复了,而我只希望重复第一个元素,即“无”。
    猜你喜欢
    • 1970-01-01
    • 2022-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多