簡體   English   中英

從python中的列表生成所有可能的2和3字符串組合

[英]Generate all possible 2 and 3 string combinations from a list in python

我有以下清單:

mylist = ['car', 'truck', 'ship']

目前,我只能使用此命令獲得2個字符串的所有可能組合:

from itertools import combinations
print(list(combinations(mylist,2)))

這給了我:

[('car', 'truck'), ('car', 'ship'), ('truck', 'ship')]

但是,實際上是所有3個字符串的一種組合。 因此,我希望我的結果是:

[('car', 'truck'), ('car', 'ship'), ('truck', 'ship'), ('car', 'truck', 'ship')]

這是電源組的調整案例。 通常,Python中電源集的代碼如下所示:

from itertools import chain, combinations

def powerset(it):
    yield from chain.from_iterable(combinations(it, r) for r in range(len(it)+1))

但是,您可以更改它以僅接受一定范圍內的結果。 您的情況是2到3:

from itertools import chain, combinations

def adjusted_powerset(it):
    yield from chain.from_iterable(combinations(it, r) for r in range(2, 3))

看到它在這里行動。

如果需要使其變得更通用,請使用range參數。 一個不錯的模板是創建powerset助手:

from itertools import chain, combinations

def powerset_helper(it, start, stop):
    yield from chain.from_iterable(combinations(it, r) for r in range(start, stop+1))

def powerset(it):
    yield from powerset_helper(it, 0, len(it))

def adjusted_powerset(it):
    yield from powerset_helper(it, 2, 3)

這個怎么樣,

from itertools import combinations

mylist = ['car', 'truck', 'ship']
result = list()

for r in [2, 3]:
    result.extend(combinations(mylist, r))

print(result)
[('car', 'truck'), ('car', 'ship'), ('truck', 'ship'), ('car', 'truck', 'ship')]

實際上,另一種組合是僅包含一個單詞的集合以及空集合。 所有* 0 <= k <= n *的所有可能組合的集合n選擇k稱為集合的集。

itertools的文檔頁面提供了如何生產它的示例。 我對它進行了少許修改,以接受一個minlength變量(在您的情況下為minlength = 2

def powerset(iterable, minlength=0):
    "powerset([1,2,3]) --> () (1,) (2,) (3,) (1,2) (1,3) (2,3) (1,2,3)"
    s = list(iterable)
    return chain.from_iterable(combinations(s, r) for r in range(minlength, len(s)+1))

itertools.combinations支持將列表長度作為輸入參數。

def combinations(iterable, r):
    # combinations('ABCD', 2) --> AB AC AD BC BD CD
    # combinations(range(4), 3) --> 012 013 023 123
    pool = tuple(iterable)
    n = len(pool)
    if r > n:
        return
    indices = range(r)
    yield tuple(pool[i] for i in indices)
    while True:
        for i in reversed(range(r)):
            if indices[i] != i + n - r:
                break
        else:
            return
        indices[i] += 1
        for j in range(i+1, r):
            indices[j] = indices[j-1] + 1
        yield tuple(pool[i] for i in indices)

對於您的情況,只需將2字符串和3字符串加在一起:

from itertools import combinations
print(list(combinations(mylist,2)) + list(combinations(mylist,3)))

暫無
暫無

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

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