在Python中计算列表中的子列表

时间:2012-03-31 11:52:13

标签: python

我有一个像p = [[[[[[[[1, 2, 3]]]]]]]]的列表,我想得到列表中项目的计数,包括空列表,所以对于这个列表我应该得到10.我试图列举像 -

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

但我无法获得空列表。请指教。

3 个答案:

答案 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