[英]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.