[英]Count all elements in list of arbitrary nested list without recursion
我剛剛學習了Python中的遞歸並完成了分配,其中一個是計算任意嵌套列表列表中的所有元素。 我搜索過這個網站,發現答案似乎都使用了遞歸調用。 由於已經教導過任何可以遞歸表達的東西都可以迭代表達,迭代在Python中是首選,如果沒有Python 2.6中的遞歸或導入模塊(作為學習練習),如何實現呢? (嵌套列表本身將被視為元素,其內容也將被計為。)例如:
>>> def element_count(p):
... count = 0
... for entry in p:
... count += 1
... if isinstance(entry, list):
... count += element_count(entry)
... return count
>>> print element_count([1, [], 3])
3
>>> print element_count([1, [1, 2, [3, 4]]])
7
>>> print element_count([[[[[[[[1, 2, 3]]]]]]]])
10
如何使用迭代編寫?
這是一種方法:
def element_count(p):
q = p[:]
count = 0
while q:
entry = q.pop()
if isinstance(entry, list):
q += entry
count += 1
return count
print element_count([1, [], 3])
print element_count([1, [1, 2, [3, 4]]])
print element_count([[[[[[[[1, 2, 3]]]]]]]])
代碼維護着要查看的事物隊列。 每當循環遇到子列表時,它就會將其內容添加到隊列中。
通常,每個遞歸問題都可以通過使用堆棧以某種方式轉換為迭代,在本例中是一個list
:
def element_count(p):
elements = list(p)
count = 0
while elements:
entry = elements.pop()
count += 1
if isinstance(entry, list):
elements.extend(entry)
return count
您可能會發現這個版本的element_count
比其他版本更強大。 它可以處理支持迭代的所有容器,並且它正確地將遞歸容器標識為具有無限數量的元素。
>>> def element_count(p):
stack, pointers, count = [iter(p)], set([id(p)]), 0
while stack:
for item in stack.pop():
try:
iterator = iter(item)
except TypeError:
pass
else:
location = id(item)
if location in pointers:
return float('inf')
stack.append(iterator)
pointers.add(location)
count += 1
return count
>>> element_count([1, [], 3])
3
>>> element_count([1, [1, 2, [3, 4]]])
7
>>> element_count([[[[[[[[1, 2, 3]]]]]]]])
10
>>> p = [1, 2, 3]
>>> element_count(p)
3
>>> p.append({4, 5, 6})
>>> element_count(p)
7
>>> p.append(p)
>>> element_count(p)
inf
>>>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.