[英]Python find all the different choices from list of list
我想從 python 的列表中獲取所有不同的選擇。 例如,拿一個像這樣的列表,
list=[[a,b,c],[a,d,e]]
我只想從每個列表中的一個中選擇 select 並獲得所有可能的不同選擇。 所以上面列出的可能選擇看起來像,
[a,a]
[a,d]
[a,e]
[b,a]
[b,d]
[b,e]
[c,a]
[c,d]
[c,e]
不使用任何外部庫,我該怎么做?
使用遞歸生成器最容易實現。
def yield_combos(lst):
if lst:
for el in lst[0]:
for combo in yield_combos(lst[1:]):
yield [el] + combo
else:
yield []
lst = [['a','b','c'], ['a','d','e']]
for combo in yield_combos(lst):
print(combo)
如果您更喜歡 output 作為列表,您可以隨時將其轉換為一個:
print(list(yield_combos(lst)))
小提示:
我在問題使用list
的地方調用了變量lst
; 覆蓋內置函數不是一個好主意,在這種情況下,這樣做會阻止對list
的調用。
為了一個獨立的程序,我在調用者中設置了一些字符串值(問題有a
代替'a'
等)。
你可以使用生成器,
perm = [(i,j) for i in list[0] for j in list[1]]
此外,如果您可以將其轉換為生成器 object,如果您擔心 memory,
perm = ((i,j) for i in list[0] for j in list[1]])
有人告訴我你有 n 個列表並且想要排列所有列表,你可以使用 while 循環
while(len(list)>1):
a = list.pop()
b = list.pop()
list.append([(i, j) for i in a for j in b])
或制作遞歸 function。 請注意,答案將是 list[0] 而不是列表本身。
最簡單的方法是使用兩個函數
def funcA(x, arr):
return [(x,c) for c in arr]
def funcB(arr1, arr2):
ans = []
for x in arr1:
ans.extend(funcA(x, arr2))
return ans
以任何需要的方式調用它:
funcB(your_list[0], your_list[1])
最 Pythonic 的方式是使用 itertools,您可以簡單地使用 itertools 庫中的產品,如下所示:
my_list = [[a,b,c],[a,d,e]]
# will contain: [(a,a), (a,d)...]
all_combinations = list(itertools.product(*my_list))
“*”將列表解包到它包含的列表中,就像這樣寫:
# will contain: [(a,a), (a,d)...]
list(itertools.product([a,b,c],[a,d,e]))
值得一提的是,這適用於任意數量的子列表。
my_list = [[a,b,c],[a,d,e], [1,2,3]]
# will contain: [(a,a,1), (a,a,2)...]
all_combinations = list(itertools.product(*my_list))
希望有幫助
l=[['a','b','c'],['a','d','e']]
def combinations(L, tmp=None):
if tmp is None:
tmp = []
if L==[]:
print (tmp)
else:
for i in L[0]:
product(L[1:], tmp+[i])
combinations(l)
這有幫助嗎?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.