我有一个像p = [[[[[[[[1, 2, 3]]]]]]]]
的列表,我想得到列表中项目的计数,包括空列表,所以对于这个列表我应该得到10.我试图列举像 -
for idx, item in enumerate(p):
count = count + idx
但我无法获得空列表。请指教。
答案 0 :(得分: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
答案 1 :(得分: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]]]]]]]])
这样可以在更少的代码中得到相同的结果,但是如果您使用的是非常大的列表,则可能会达到递归限制。
答案 2 :(得分: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