簡體   English   中英

Python 從列表列表中找到所有不同的選擇

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

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