【问题标题】:How can I make function that takes a list as input and returns the sum?如何制作将列表作为输入并返回总和的函数?
【发布时间】:2021-10-26 07:11:59
【问题描述】:

我想创建一个函数,它将列表作为输入并返回列表元素之间的整数、实数和复数之和。 作为列表元素,数据类型计算和时排除整数、实数和复数以外的对象。

所以我就这样写了代码

def number_sum(lst):
    total = 0
    for e in lst:
        if type(e) == int or type(e) == float or type(e) == complex:
            total += e
    return total

x1 = [1, 3, 5, 7, 9]                     # 25
x2 = ["abc", [3, 5], 3.5, 2+3j, 4.5, 10] # 20 + 3j
x3 = []                                  # 0

print(number_sum(x1))
print(number_sum(x2))
print(number_sum(x3))

但我希望我可以在输入中获取 x1、x2、x3 列表。我该如何解决?

【问题讨论】:

  • 对不起,这是我的错误! x2 的结果是 #20 + 3j。
  • x2 中的任何嵌套列表也会出现问题,递归调用 number_sum 的 elif 语句可以解决此问题
  • 结果是 20 + 3j 还是 28 + 3j?
  • 20 + 3j 是结果!

标签: python list function input sum


【解决方案1】:

使用numbers.Number 检查值是否为数字。来自文档:

数字层次结构的根。如果你只是想检查一个 参数 x 是一个数字,不管是什么类型,使用 isinstance(x, 号)。

代码

import numbers


def number_sum(lst):
    def get_numbers(l):
        """Generator that returns a flatten view a list"""
        for e in l:
            if isinstance(e, numbers.Number):
                yield e
            elif isinstance(e, (tuple, list)):
                yield from get_numbers(e)

    return sum(get_numbers(lst))


x1 = [1, 3, 5, 7, 9]
x2 = ["abc", [3, 5], 3.5, 2 + 3j, 4.5, 10]

print(number_sum(x1))
print(number_sum(x2))

输出

25
(28+3j)

请注意,函数get_numbers 是一个生成器,它使用yieldyield from 来展平和过滤嵌套列表。然后将get_numbers 的结果传递给内置函数sum 以实际求和。

【讨论】:

    【解决方案2】:

    您可以使用x = input("Enter the List: "),以便用户可以在一行中输入列表。
    导入 ast
    如果您希望用户输入列表为 [1,2,3],请使用
    @ 987654323@
    x = input()
    x = ast.literal_eval(x)
    这会将字符串变成一个列表。
    最后您的代码将如下所示:

    import ast
    
    x = input("Enter the List: ")
    x = ast.literal_eval(x)
    

    然后,执行您想要执行的必要功能
    感谢@Matthis 和@S3DEV 提出改进建议

    【讨论】:

    • 我是否可以建议您在阅读并理解“Eval really is dangerous”之前不要再使用或提倡eval
    • 我全心全意地支持@Matthias 的评论。事实上,打败我。此外,这个“如果这个答案解决了你的问题,请选择它作为你的答案”被认为是糟糕的形式。
    猜你喜欢
    • 2020-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多