簡體   English   中英

列表遞歸中的Python3列表

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

第二種方法,將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.

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