我正在嘗試獲取串列的長度,但該串列可以包含其他深度嵌套的串列(例如[[[[[[[]]]]]]])。
但是您還必須在計數中獲取任何非串列元素:[1, 2, [3, 4]]將輸出 5(1、2、3、4 和一個串列)。["a", "b", ["c", "d", ["e"]]]將輸出 7。
首先想到使用遞回來解決這個問題。我寫了這個:
def deep_count(arr, count=0):
if any(type(i) == list for i in arr):
for i in arr:
if type(i) == list:
count = len(arr)
else:
count = 1
return deep_count(arr[1:], count)
return count
它輸出 9 而不是 7。如果它只是像它這樣的嵌套串列,[[[]]]它只會輸出 1。
uj5u.com熱心網友回復:
似乎不需要提供初始值,您可以將arr其用作唯一引數,然后獲取計數,如果當前元素是串列,則還添加該串列的計數。
def f(arr):
count = 0
for element in arr:
count = 1
if isinstance(element, list):
count = f(element)
return count
或者更簡潔地說,使用列舉:
def f(arr):
sub_count, i = 0, 0
for i, element in enumerate(arr, 1):
if isinstance(element, list):
sub_count = f(element)
return i sub_count
>>> f([1, 2, [3, 4]])
5
>>> f(["a", "b", ["c", "d", ["e"]]])
7
uj5u.com熱心網友回復:
遞回添加所有串列長度(在線嘗試!):
def f(xs):
return len(xs) sum(f(x) for x in xs
if isinstance(x, list))
變體(在線嘗試!):
def f(xs):
return isinstance(xs, list) and len(xs) sum(map(f, xs))
uj5u.com熱心網友回復:
在談論遞回時,請始終考慮基本情況(這種情況不會進行遞回)。在您的問題中,當串列為空時,它將回傳計數 0。
所以你可以像這樣開始實作它:
def f(arr):
if arr == []:
return 0
對于其余的實作,您有兩種方法:
- 回圈遍歷串列并
f(sublist)在它實際上是子串列時添加到計數中,并1在它不是時添加 - 進行完全遞回并始終呼叫該
f(x)函式,無論它是否是子串列,并且始終將結果添加到計數中。在這種情況下,您有一個新的基本案例f(not_a_list)將回傳1
我認為這應該會讓你失望
注意:我剛剛讀到不需要遞回,你想出了它。我認為這是解決此類問題的好方法
uj5u.com熱心網友回復:
我的舊答案將 OP 的最后一個示例的結果作為預期輸出。如果不考慮,答案很簡單:
>>> def count_deep_list(lst):
... return sum(count_deep_list(val) for val in lst if isinstance(val, list)) len(lst)
...
>>> count_deep_list([1, 2, [3, 4]])
5
>>> count_deep_list(["a", "b", ["c", "d", ["e"]]])
7
>>> count_deep_list([[[]]])
2
舊答案:
看來你需要對內部空串列和傳入串列本身進行特殊判斷。我認為它需要在閉包的幫助下實作:
>>> def count_deep_list(lst):
... def count(_lst):
... if isinstance(_lst, list):
... if not _lst:
... return 0
... else:
... return sum(map(count, _lst)) 1
... else:
... return 1
...
... return count(lst) - 1 if lst else 0
...
>>> count_deep_list([1, 2, [3, 4]])
5
>>> count_deep_list(["a", "b", ["c", "d", ["e"]]])
7
>>> count_deep_list([[[]]])
1
更簡單的實作:
>>> def count_deep_list(lst):
... def count(_lst):
... return sum(count(val) if val else -1 for val in _lst if isinstance(val, list)) len(_lst)
... return count(lst) if lst else 0
...
>>> count_deep_list([1, 2, [3, 4]])
5
>>> count_deep_list(["a", "b", ["c", "d", ["e"]]])
7
>>> count_deep_list([[[]]])
1
uj5u.com熱心網友回復:
class Counter:
def __init__(self):
self.counter = 0
def count_elements(self, l):
for el in l:
if type(el) == list:
self.counter = 1
self.count_elements(el)
else:
self.counter = 1
l = ["a", "b", ["c", "d", ["e"]]]
c = Counter()
c.count_elements(l)
print(c.counter)
uj5u.com熱心網友回復:
試試這個,
def flatten(seq, container=None):
if container is None:
container = []
for s in seq:
try:
iter(s) # check if it's iterable
except TypeError:
container.append(s)
else:
flatten(s, container) #Recursion to check nested list
return container
d = flatten([1,[1,2,[2,1],[1,1,[1,2]]]])
print(d) #Flatten to 1D Array [1, 1, 2, 2, 1, 1, 1, 1, 2]
print(d.count(1)) #output 6
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/478850.html
