【问题标题】:count the sum of the nested list which contains strings and ints in python计算包含python中字符串和整数的嵌套列表的总和
【发布时间】:2022-01-24 11:56:11
【问题描述】:

我知道如何获得仅包含数字的嵌套列表的总和,但我如何获得同时包含字符串和数字的嵌套列表的总和?

def sum_all_numbers(seq):
    if not seq:
        return 0
    elif isinstance(seq[0], str):
        seq.remove(seq[0])
    elif isinstance(seq[0], list):
        return sum_all_numbers(seq[0]) + sum_all_numbers(seq[1:])
    else:
        return seq[0] + sum_all_numbers(seq[1:])

我想使用双重递归来解决这个问题,但我没有设法让 isinstance 部分正确。

sum_all_numbers(["a", "b", ["c", 3, 4, [5, "d"], 10], 9])

是输入

【问题讨论】:

  • 请注意,当您执行seq.remove(seq[0]) 时,您实际上是在修改seq 并删除一个元素!这不是您的功能应该做的;它只应该对数字求和而不会损坏列表。其他语言有一个const 关键字来保证函数不会损坏它的参数; python没有,所以你必须格外小心。

标签: python recursion nested-lists


【解决方案1】:

您可以将所有列表展平为单个列表,然后遍历并过滤列表 reuslt 或在遍历列表时过滤值。

使用第二种方法添加代码

# your code goes here
def get_sum(array: list):
    sum_ = 0
    for i in array:
        if type(i)==int:
            sum_+= i
        elif type(i) in [list, tuple]:
            sum_+= get_sum(i)
    return sum_


result = get_sum(["a", "b", ["c", 3, 4,(1,2,['a', 'b', [1,2,0]],'a',33), [5, "d"], 10], 9])
print(result)
# output 70

【讨论】:

【解决方案2】:

我建议使用:

  • try/except 尝试加号;
  • isinstance(x, (str, bytes)) 测试x 是否为字符串。

这样,您可以添加任何数字,而不仅仅是int

def sum_all_numbers(seq):
    result = 0
    for x in seq:
        try:
            result += x
        except TypeError:
            if not isinstance(x, (str, bytes)):
                result += sum_all_numbers(x)
    return result

print( sum_all_numbers(["a", "b", ["c", 3, 4, [5, "d"], 10], 9]) )
# 31

请注意,如果嵌套结构包含非数字、字符串或可迭代的内容,则此版本将失败:

sum_all_numbers([None, 3, 4])
# TypeError: 'NoneType' object is not iterable

要修复它,我们可以使用新的try/exceptiter

def sum_all_numbers(seq):
    result = 0
    for x in seq:
        try:
            result += x
        except TypeError:
            if not isinstance(x, (str, bytes)):
                try:
                    subseq = iter(x)
                    result += sum_all_numbers(subseq)
                except TypeError:
                    pass
    return result

print( sum_all_numbers(["a", "b", ["c", 3, 4, [None, 12.0], [5, "d"], 10], 9]) )
# 43.0

我建议阅读the python sourcecode of more_itertools.collapse,以获得更多想法和错误处理以包含在此功能中。

【讨论】:

  • try and exxcept 是一项昂贵的操作,使用它们两次是不好的做法。要检查任何类型的对象,您可以检查该 ojbect 是否是可迭代的,即 object.__iter__ 并根据输出您可以做出/做出决定,无需使用这些尝试,除了繁重的操作
  • @sahasrara62 我不同意你的评论。有些对象是可迭代的,但没有实现您提到的 .__iter__ 方法。请参阅In python, how do I determine if an object is iterable? 了解有关该问题的更长时间的讨论。
猜你喜欢
  • 2017-11-04
  • 1970-01-01
  • 2015-10-05
  • 2013-01-24
  • 2021-12-11
  • 2015-05-09
  • 2020-12-22
  • 1970-01-01
  • 2013-08-04
相关资源
最近更新 更多