2012-03-31 136 views
2

我有一個列表,如p = [[[[[[[[1, 2, 3]]]]]]]],我想要列表中列出的項目包括空列表的計數,所以對於此列表,我應該得到10.我試圖枚舉列表 -在Python中列表列表中列表中的子列表

for idx, item in enumerate(p): 
    count = count + idx 

但我無法獲得空列表。請指教。

+3

沒有空列表在那裏。 – jamylak 2012-03-31 12:04:06

+0

你能解釋一下你如何得到10的清單? – 2012-03-31 12:05:29

+0

他計數每個列表中的項目數並將它們加在一起 – jamylak 2012-03-31 12:07:10

回答

6

較短版本的代碼如下:

>>> def recur_len(l): 
     return sum(1 + recur_len(item) if isinstance(item,list) else 1 for item in l) 

>>> recur_len([[[[[[[[1, 2, 3]]]]]]]]) 
10 

更詳細的代碼

>>> def recur_len(l): 
     count = 0 
     for item in l: 
      if isinstance(item,list): 
       count += 1 + recur_len(item) 
      else: 
       count += 1 
     return count 

>>> recur_len([[[[[[[[1, 2, 3]]]]]]]]) 
10 
+0

+1我會留下我的回答,但這是OP實際需要的。問題的措辭不是很清楚,例子不明確。 – 2012-03-31 12:27:07

+0

是的,我同意我不明白整個'空列表的東西' – jamylak 2012-03-31 12:29:15

+0

謝謝,下次會更具描述性。現在是時候坐下來學習這個代碼的工作原理了,非常感謝 – Varun 2012-03-31 12:37:52

2

如果您只想計算列表(或list子類),沒有別的,只是不只是包含另一個列表的最後名單的內容:

def len_counting_containers(inlist): 
    count = 0 
    current = inlist 
    while len(current) == 1 and isinstance(current[0], list): 
     count += 1 
     current = current[0] 
    return count + len(current) 

len_counting_containers([[[[[[[[1, 2, 3]]]]]]]]) 

這給了我們:

10 

請注意,這是一個非常脆弱的操作(因爲您在python中使用isinstance()) - 所以您要確保您的傳入數據總是按照您的預期構建。如果您的數據來自您控制的來源,我建議您查看您如何生成數據並查看是否可以以更好的形式提供數據 - 例如:(7, [1,2,3])

您還可以遞歸實現這一點:

def len_counting_containers(current): 
    return len_counting_containers(current[0])+1 if len(current) == 1 and isinstance(current[0], list) else len(current) 

len_counting_containers([[[[[[[[1, 2, 3]]]]]]]]) 

這使更少的代碼相同的結果,但如果你有瘋狂的大名單,這可能打擊遞歸限制工作。

+0

謝謝,我是一個新手,在這裏儘可能地掌握我的能力,如果我將列表更改爲myList =([1,[1,2,[3, 4]]]),這個操作我只有2個,但我有7個項目,請解釋一下,我會嘗試自己編碼 – Varun 2012-03-31 12:19:46

+0

啊,你說包括'空列表',所以我推測你的意思是隻包含一個列表項目。我認爲[jamylak的答案](http://stackoverflow.com/a/9955769/722121)做你想做的。 – 2012-03-31 12:22:14

2
def depth(a): 
    return 1 + depth(a[0]) if type(a) is list else 0 

演示:

a = 'x' 
for n in range(10): 
    a = [a] 
    print a, depth(a) 


## ['x'] 1 
## [['x']] 2 
## [[['x']]] 3 
## [[[['x']]]] 4 
## [[[[['x']]]]] 5 
## [[[[[['x']]]]]] 6 
## [[[[[[['x']]]]]]] 7 
## [[[[[[[['x']]]]]]]] 8 
## [[[[[[[[['x']]]]]]]]] 9 
## [[[[[[[[[['x']]]]]]]]]] 10 
+0

'code' DEF deep_count(P): \t總和= 0 \t爲電子在號碼: \t \t總和=總和+ 1 \t \t如果is_list(E): \t \t \t總和=總和+ deep_count(例如) \t return sum'code' – Varun 2012-04-04 10:39:02