0

我试图弄清楚如何计算嵌套列表中的项目数。我被困在如何开始这个问题上。例如,如果我要执行 NestLst([]) 它会打印 0 但如果我这样做

NestLst([[2, [[9]], [1]], [[[[5]]], ['hat', 'bat'], [3.44], ['hat', ['bat']]]]

它会返回 9。有关如何开始或如何执行此操作的任何帮助都会很棒。

谢谢!

4

4 回答 4

1
import collections
def NestLst(seq):
    if isinstance(seq, str) or not isinstance(seq, collections.Iterable):
        return 1
    return sum(NestLst(x) for x in seq)

>>> NestLst([[2, [[9]], [1]], [[[[5]]], ['hat', 'bat'], [3.44], ['hat', ['bat']]]])
9
于 2013-06-04T10:13:47.283 回答
1
def total_length(l):
    if isinstance(l, list):
        return sum(total_length(x) for x in l)
    else:
        return 1
于 2013-06-04T10:14:55.483 回答
0

您可以尝试递归调用reduce()。像这样的东西:

>>> def accumulator(x,y):
...     if isinstance(y, list):
...         return reduce(accumulator,y,x)
...     else:
...         return x+1
... 
>>> reduce(accumulator, [10,20,30,40] ,0)
4
>>> reduce(accumulator, [10,[20,30],40] ,0)
4
>>> reduce(accumulator, [10,20,30,40,[]] ,0)
4
>>> reduce(accumulator, [10,[20,[30,[40]]]] ,0)
4
>>> reduce(accumulator, [10*i for i in range(1,5)] ,0)
4

一些注意事项:

  • 空集合将计入 0 个项目(参见最后一个示例)
  • 最后调用的是初始值0reduce()这可能是一个陷阱,因为当省略它时,您仍然有一个有效的调用,但结果不会是您想要的。我强烈建议将初始调用包装在实用函数中。
于 2013-06-04T10:54:20.493 回答
0

您的问题包含关键字:递归。创建一个遍历列表的函数,如果找到非列表项,则将计数加一,如果找到列表,则递归调用自身。

您的代码的问题在于您使用的是长度而不是递归调用。

这是一个pythonic伪代码:

def count(list):
    answer = 0
    for item in list:
        if item is not a list:
            answer += 1
        else:
            answer += number of items in the sublist (recursion will be useful here)
于 2013-06-04T10:12:15.357 回答