所以我做了一個簡單的程式,假設計算給定串列中所有可能的串列。例如 [1,2,3] 程式假設回傳: [1,2,3], [2,3], [1,3], [1], [2], [3], [] 但是是 'NoneType' 物件沒有屬性 'append
def __bacteria(mass_list, count, option_list):
if len(mass_list) == count:
return option_list
return __bacteria(mass_list,count 1, option_list.append(mass_list[count])) or __bacteria(mass_list,count 1, option_list)
uj5u.com熱心網友回復:
那么,為什么它不起作用?讓我們添加一些型別注釋并運行像MyPy這樣的型別檢查器,這些可以幫助我個人找出很多錯誤:
def __bacteria(mass_list: list[int], count: int, option_list: list[int]) -> list[list[int]]:
if len(mass_list) == count:
return option_list # error: list[int] given but list[list[int]] expected
return __bacteria(mass_list, count 1,
option_list.append(mass_list[count]) # error: None given but list[int] expected
) or __bacteria(mass_list , count 1, option_list)
好的,所以到目前為止它顯示了 2 個錯誤。第一個是什么?好吧,您回傳當前選項,而不是當前選項的串列。
至于第二個,list.append就地修改串列,回傳None. 這些都不是你想要的。正如@Michael Butscher 所建議的那樣,您想要的是:option_list [mass_list[count]]。所以現在我們有:
def __bacteria(mass_list: list[int], count: int, option_list: list[int]) -> list[list[int]]:
if len(mass_list) == count:
return [option_list]
return (__bacteria(mass_list, count 1, option_list [mass_list[count]]) or
__bacteria(mass_list, count 1, option_list))
在運行型別檢查器或運行代碼時,這不應該給出任何錯誤。但我敢打賭它列印出錯誤的東西。怎么會這樣?
基本情況 ( if len(mass_list) == count) 應該沒問題。第一次遞回呼叫似乎也很好,第二次遞回呼叫也很好。還剩下什么?只有or.
現在or當給定串列作為引數時會做什么?在互動式解釋器上嘗試一下。結果是[] or []什么?結果[1] or [2]呢?結果[] or [0]呢?or給定兩個串列時實作的邏輯規則是什么?
那么我們在這里需要什么?好吧,我們知道它__bacteria回傳一個串列串列(list[list[int]]準確地說),我們需要回傳一個串列串列,其中包含第一次遞回呼叫回傳的串列項和第二次遞回呼叫回傳的串列項。就是 這樣!所以現在我們有:
def __bacteria(mass_list: list[int], count: int, option_list: list[int]) -> list[list[int]]:
if len(mass_list) == count:
return [option_list]
return (__bacteria(mass_list, count 1, option_list [mass_list[count]])
__bacteria(mass_list, count 1, option_list))
我們可以做得比這更好。一方面,我們通過創建許多較小的串列并復制它們以將它們連接多次來構建一個串列。嘗試給一個更大的mass_list,看看你的程式是如何變慢的。
使其更快并使用更少記憶體的一種方法是使用生成器作為輔助函式。我將重命名函式和引數以使事情更清楚:
from typing import Iterator
def powerset(items: list[int]) -> list[list[int]]:
return list(powerset_helper(items, 0, []))
def powerset_helper(items: list[int], index: int, to_include: list[int]) -> Iterator[list[int]]:
if index == len(items):
yield to_include
return
yield from powerset_helper(items, index 1, to_include [items[index]])
yield from powerset_helper(items, index 1, to_include)
不過,我們可以做得更好,那就是簡單地使用@Dalmas Otieno 的答案!:)
uj5u.com熱心網友回復:
我認為您正在嘗試獲得一組功率組。如果是這樣,您可以按以下方式進行:
from itertools import chain, combinations
def all_possible_lists(iterable):
l = list(iterable)
pset = chain.from_iterable(combinations(l, n) for n in range(len(l) 1))
return [list(i) for i in pset]
print(all_possible_lists([1, 2, 3]))
輸出是
[[], [1], [2], [3], [1, 2], [1, 3], [2, 3], [1, 2, 3]]
uj5u.com熱心網友回復:
我想你正在尋找這個沒有任何庫的電源集?
那么試試這個:
def powerSet(nums):
''' nums is a list, [1, 2, 3]
generate all subset - by adding one at a time
'''
ans = [[]]
for n in nums:
ans = [a [n] for a in ans]
return ans
print(powerSet([1, 2, 3])) # NB - if empty list is undesired, you could filter it out.
輸出:
[[], [1], [2], [1, 2], [3], [1, 3], [2, 3], [1, 2, 3]]
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/507849.html
上一篇:使用遞回動態創建React組件
下一篇:如何通過父級中不存在的屬性過濾樹
