如何在我任意嵌套的列表列表中获取元素总数?

mic*_*pri 11 python list nested-lists python-2.7

我有一个分配给变量的列表my_list.价值my_list[[1,2,3],[3,5,[2,3]], [[3,2],[5,[4]]]].我需要找到长度my_list,但len(my_list)只返回3.我希望它返回11.是否有任何Python函数将返回my_list嵌套列表的全长和所有.

例:

Input
[[1,2,3],[3,5,[2,3]], [[3,2],[5,[4]]]]

Output
11
Run Code Online (Sandbox Code Playgroud)

我想如果这不仅适用于数字,还适用于字符串.

sto*_*m92 17

此函数计算列表的长度,将列表以外的任何对象计为长度1,并在列表项上递归以查找展平的长度,并且可以使用任何程度的嵌套直到解释器的最大堆栈深度.

def recursive_len(item):
    if type(item) == list:
        return sum(recursive_len(subitem) for subitem in item)
    else:
        return 1
Run Code Online (Sandbox Code Playgroud)

注意:根据如何使用它,最好检查项是否可迭代而不是检查它是否具有类型list,以便正确判断元组的大小等.但是,检查对象是否可迭代将具有计算字符串中的每个字符而不是给出字符串长度1的副作用,这可能是不期望的.

  • `if isinstance(item,collections.Iterable)而不是isinstance(item,basestring):` (4认同)

Anz*_*zel 6

作为替代方案,您可以使用flattenlen:

from compiler.ast import flatten

my_list = [[1,2,3],[3,5,[2,3]], [[3,2],[5,[4]]]]

len(flatten(my_list))
11
Run Code Online (Sandbox Code Playgroud)

PS.感谢@thefourtheye指出,请注意:

从2.6版开始不推荐使用:Python 3中已删除了编译器包.

替代方案可以在这里找到:Python 3替换不推荐的compiler.ast展平函数

  • `compiler.ast.flatten`很久以前就被弃用了. (2认同)

Jea*_*bre 5

破解解决方案,有人不得不发布它。将列表转换为字符串(将繁重的工作/递归留给__str__运算符),然后计算逗号,加1。

>>> my_list = [[1,2,3],[3,5,[2,3]], [[3,2],[5,[4]]]]
>>> str(my_list).count(",")+1
11
Run Code Online (Sandbox Code Playgroud)

(适用于整数和浮点数,对于字符串来说当然会失败,因为它们可能包含逗号)

编辑:此hack不占空列表:我们必须删除[]元素:

>>> my_list = [[1,2,3],[3,5,[2,3]], [[3,2],[5,[4],[]]]]  # added empty list at the end
>>> s = str(my_list)
>>> s.count(",")-s.count("[]")+1   # still 11
Run Code Online (Sandbox Code Playgroud)