如何找到多维列表的长度?

7

如何查找多维列表的长度?

我自己想到了一种方法,但这是查找多维列表中值数量的唯一方式吗?

multilist = [['1', '2', 'Ham', '4'], ['5', 'ABCD', 'Foo'], ['Bar', 'Lu', 'Shou']]
counter = 0
for minilist in multilist:
    for value in minilist:
        counter += 1

print(counter)

我相信有一种更简单的方法来查找多维列表的长度,但是len(list)无法正常工作,因为它只提供了列表内列表的数量。有比这更高效的方法吗?


2
用Python,总是有的。 - squiguy
这些列表是否仅限于2个级别,还是可以更深层次? - Georg Schölly
4个回答

12

怎么样:

sum(len(x) for x in multilist)

5

@mgilson的解决方案的替代方法

sum(map(len, multilist))

1
如果您想获取任何n维列表中的项目数量,则需要使用类似于以下的递归函数:
def List_Amount(List):
    return _List_Amount(List)
def _List_Amount(List):
    counter = 0
    if isinstance(List, list):
        for l in List:
            c = _List_Amount(l)
            counter+=c
        return counter
    else:
        return 1

这将返回列表中的项目数量,无论您的列表的形状或大小如何。

0

另一个选择(要么就是看错过的数学课程...)

def getLength(element):
    if isinstance(element, list):
        return sum([getLength(i) for i in element])
    return 1

这允许不同程度的“多维度”(如果这是一个词)共存。

例如:

>>> getLength([[1,2],3,4])
4

或者,为了允许不同的集合类型

def getLength(element):
    try:
        element.__iter__
        return sum([getLength(i) for i in element])
    except:
        return 1

例如:

>>> getLength([ 1, 2, (1,3,4), {4:3} ])
6
>>> getLength(["cat","dog"])
2

(请注意,尽管字符串是可迭代的,但它们没有__iter__方法包装器,因此不会引起任何问题...)

提醒一下,如果数据结构中有任何字符串,最后一个版本的代码将会出错,因为"A"是可迭代的,它唯一的成员也是"A"(当达到递归限制时会导致错误)。我想,如果您创建一个包含对自身的引用的列表,它也将无限递归,但这不太可能是意外发生的。此外,您将无法正确计算作为字典值容器中的项目(尽管您将计算元组键中的值)。 - Blckknght
我认为不应该。我的Python版本(2.7.2)对“string”.__iter__引发错误。 - Anti Earth
哦,这很奇怪。str.__iter__在Python 3中确实存在,并且即使在Python 2中,调用iter("foo")也可以正常工作。 - Blckknght

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接