2011-10-09 17 views
4

我有一個數組:x = [ [1, 2], 1, 1, [2, 1, [1, 2]] ] 中,我要計數的數量1的每次出現,以及存儲在變量one_counter該號碼。 x.count(1)只返回2次出現1,這是不夠的。

我的下面的代碼服務於我的目的,並在one_counter5,但它看起來凌亂,感覺unpythonic給我。

任何建議如何提高pythonicity並將其擴展到更多維度列表?

謝謝!的Python - 尋找在混合陣列的值在每次出現時(整數,列表)

x = [[1, 2], 1, 1, [2, 1, [1, 2]]] 

one_counter = 0 

for i in x: 
    if type(i) == list: 
     for j in i: 
      if type(j) == list: 
       for k in j: 
        if k == 1: 
         one_counter += 1 

      else: 
       if j == 1: 
        one_counter += 1 

    else: 
     if i == 1: 
      one_counter += 1 
+1

規模與此有什麼關係? –

+0

@ IgnacioVazquez-Abrams我猜他濫用了Scale這個詞,他可能意味着他的數據類型擴展到更多維度列表。 – DhruvPathak

+0

@DhruvPathak是的,先生!我誤解了規模。 –

回答

8

你可以使用遞歸:

def flatten_count(iterable, element): 
    count = 0 
    for item in iterable: 
     if item == element: 
      count += 1 
     if isinstance(item, list): 
      count += flatten_count(item, element) 
    return count 

或者更簡潔:

def flatten_count(iterable, element): 
    return sum(
     flatten_count(item, element) if isinstance(item, list) else item == element 
     for item in iterable 
    ) 

使用這樣的:

>>> x = [[1, 2], 1, 1, [2, 1, [1, 2]]] 
>>> print(flatten_count(x, 1)) 
5 
+0

非常感謝,馬克!這是非常有意義的,現在我更好地理解遞歸,以及isinstance()的操作。 –

3

哈克的解決方案,通過數據類型的轉換工作字符串: http://codepad.org/vNEv6B8M

import re 
x = [ [1, 2], 1, 1, [2, 1, [1, 2]] ] 
nums = [int(i) for i in re.findall(r'\d+', str(x))] 
print(nums.count(1)) 
2

我認爲最好將這個任務分成兩部分。

第1部分

第1部分是創建一個發電機,其將變平輸入列表中。

def flatten_list(L): 
    for i in L: 
     if isinstance(i,list): 
      for j in flatten_list(i): 
       yield j 
     else: 
      yield i 

測試輸出:

x = [[1, 2], 1, 1, [2, 1, [1, 2]]] 

for i in flatten_list(x): 
    print i 

輸出:

1 
2 
1 
1 
2 
1 
1 
2 

第2部分

第2部分是使用扁平的列表來計數的1出現次數它:

print(sum(i==1 for i in flatten_list(x))) 

輸出:

5 

注意i==1回報True如果i=1False如果i不等於1。但是True等於1False等於0,所以sum只是計算了True出現次數(在這種情況下等於5)。

+0

感謝您的分解。對此,我真的非常感激。 –

相關問題