[英]Python3 Lists in Lists recursion
因此,我試圖計算某個事物(例如“ X”)出現在列表中的次數,而不使用for循環。 所以我嘗試了兩件事:
例如:b = [[“ X”,2,4],[2,3,1],[“ X”,“ X”,1]],countX應該返回=> 3
我第一次嘗試這樣:
def countX(b):
if b == []:
return 0
elif b[0] == []:
return countX(b[1:])
elif b[0][0] == "X":
return countX(b[0][1:]) + 1
else:
return countX(b[0][1:])
但我想我錯過了一個案例? 如果有人知道這里出了什么問題,請解釋:)
我嘗試使用count的第二種方法是這樣的:
def countX(b, posn):
if posn == len(b):
return 0
else:
return countX(b, pos+1) + b(pos).count("X")
對於這種方法,我將在posn中輸入0,但是我也收到了一個我不明白的錯誤...它說“列表”對象不可調用。 這意味着什么?
我並不是真的想要一個更簡單的方法來解決這個問題,我只是想知道為什么我嘗試過的兩種方法都不起作用,以及如何解決它們。
提前致謝!
〜edit:並且不導入任何東西〜
在您的第一個程序中,問問自己,當b是一個列表並且它的第一個元素是“ X”時會發生什么。 (提示:這將是一個IndexError)
其他答案避免了顯式循環,但仍在后台使用它們。 因此,如果您真的確定要避免任何循環...。
def func(li):
ans=0
if type(li) is list and len(li):
ans+=func(li[0])
ans+=func(li[1:])
elif li=='X':
return 1
return ans
運行時:
>>> b=[[23,'X',['X','jh',['as','X']],['X']],'X','S']
>>> func(b)
5
基本上,您需要在迭代b
或嘗試使用b[0]
或b[1:]
訪問其元素之前確保b
是一個列表。
為第一種方法嘗試以下方法:
import collections
def count_X(b):
if b == "X":
return 1
if isinstance(b, collections.Iterable):
return sum(count_X(elem) for elem in b)
else:
return 0
如果確定只處理列表,則可以替換collections.Iterable
為list
。
第二種方法,將b(pos)
更改為b[pos]
,使用[]
獲取列表項:
>>> b = [["X",2,4],[2,3,1],["X","X",1]]
>>> def count_X(b, pos):
... if pos == len(b):
... return 0
... else:
... return count_X(b, pos+1) + b[pos].count('X')
...
>>> count_X(b,0)
3
>>>
日冰。 在第一種方法中,如果b [0] [0] ==“ X”,則只在第一行b [0]上遞歸。 您需要在沒有第一列的情況下遞歸到第一行(如您所做的那樣),再在其他行(即b [1:])上遞歸,或者像在...中那樣刪除b [0] [0]。
def count_X(b, r, c):
if r == len(b):
return 0
if c == len(b[r]):
return count_X(b, r+1, 0)
count = count_X(b, r, c+1)
if b[r][c] == "X":
count += 1
return count
在第二種方法中,如果存在X,則永遠不會添加1。由於b(pos)無效,因此會出現錯誤-這是應用於列表的函數調用語法。 我建議使用二維pos來跟蹤行和列的位置...
def count_X(b, r, c):
if r == len(b):
return 0
if c == len(b[r]):
return count_X(b, r+1, 0)
count = count_X(b, r, c+1)
if b[r][c] == "X":
count += 1
return count
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.