2012-03-31 132 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