2016-10-31 182 views
0
def nested_count(l : 'any nested list of int', a : int) -> int: 
    c = 0 
    while len(l) != 0: 
     for x in l: 
      if type(x) == int: 
       if x == a: 
        c = c + 1 
        l.remove(x) 
        nested_count(l,a) 
       else: 
        continue 
      elif type(x) == list: 
       nested_count(x,a) 
    return c 

這個函數傳入一個int和一個int的嵌套列表作爲參數;它返回一個int參數出現在嵌套列表參數的次數,例如:返回一個int的遞歸函數

nested_count([[1,2,[4,[1],8],[1,3,2]],[1,1]], 1) 

回報5

我不知道爲什麼我的功能不起作用

誰能告訴我如何解決它?非常感謝。

+2

您需要返回遞歸函數調用的結果。例如'return nested_count(l,a)' – thefourtheye

+2

您不應該在迭代列表時改變列表。 – niemmi

回答

0

您不添加nested_count結果c

def nested_count(lst, l): 
    c = 0 
    for i in lst: 
     if i == l: 
      c += 1 
     elif type(i) == list: 
      c += nested_count(i, l) 
    return c 

而且最好是列表迭代與。

1

不使用嵌套函數調用的結果。您可能應該分別替換c += nested_count(l,a)c += nested_count(x,a)

0

您不應該在遍歷列表時改變列表,而需要從遞歸調用中返回結果。您可以通過檢查l的類型並且如果它是int然後返回bool來確定它是否與a匹配,可以大大簡化功能。如果l是一個列表只是調用nested_count遞歸在其項目和sum結果:

def nested_count(l, a): 
    # Base case 
    if type(l) == int: 
     return l == a 
    return sum(nested_count(x, a) for x in l) 
0

爲什麼異質列表?如果你不打算輸入所有參數,爲什麼還要打字?你爲什麼要改變輸入?

from typing import List 

def deep_count_elem (x:int, xs:List) -> int: 
    # done 
    if len(xs) == 0: 
    return 0 
    # if list, count in this list and recurse 
    elif isinstance(xs[0], list): 
    return deep_count_elem(x, xs[0]) + deep_count_elem(x, xs[1:]) 
    # if element matches, add 1 
    elif x == xs[0]: 
    return 1 + deep_count_elem(x, xs[1:]) 
    # otherwise add nothing, move to next element 
    else: 
    return deep_count_elem(x, xs[1:]) 

print(deep_count_elem(1, [[1,2,[4,[1],8],[1,3,2]],[1,1]])) # 5 
0

正如其他人所說,你需要從nested_count遞歸調用積累的返回值,以獲得正確的總計。

此外,從有你遍歷可能會導致意想不到的結果列表(或其他集合)中刪除項目,詳見所以Python常見的問題Removing items from a list while iterating over the list和一些相關的SO頁,具體爲:Removing from a list while iterating over it

一般優選call isinstance rather than type做型式試驗。 isinstance函數可以在一次調用中測試多種類型,如果對象是指定類型的子類,它也會返回True。

這裏有幾個處理列表或元組的單行程序。

def nested_count(l, a): 
    return sum(nested_count(x, a) if isinstance(x, (list, tuple)) else x == a for x in l) 

def nested_count(l, a): 
    return l.count(a) + sum(nested_count(x, a) for x in l if isinstance(x, (list, tuple)))