簡體   English   中英

如何使用python生成僅重復一個元素的組合

[英]How to generate combinations with repetition of only one element using python

我是一個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個列表,例如可能有ac = [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)

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)]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM