【问题标题】:Python code for sum with condition带条件求和的 Python 代码
【发布时间】:2014-04-06 15:08:12
【问题描述】:

任务如下:将具有偶数索引的列表元素相加,并将结果乘以最后一个列表的元素。 我在 Python 中有这个 oneliner 解决方案代码。

array = [-37,-36,-19,-99,29,20,3,-7,-64,84,36,62,26,-76,55,-24,84,49,-65,41] 
print sum(i for i in array if array.index(i) % 2 == 0)*array[-1] if array != [] else 0

我的结果是-1476(计算结果是:41*(-37-19+29+3-64+36+26+55+84-65))

正确的结果是 1968 年。

我不明白为什么这段代码在这种特殊情况下不能正常工作。

【问题讨论】:

    标签: python list sum conditional-statements slice


    【解决方案1】:

    这就是你要找的东西:

    array[-1] * sum(array[::2])
    

    array[::2] 以两步(即每个备用数字)从第一个索引到最后一个索引遍历数组。 sum(array[::2]) 从原始列表中获取备用数字的总和。

    只有当您确定列表没有重复项时,使用 index 才会按预期工作,这就是您的代码无法给出正确结果的原因。

    【讨论】:

    • 这是一种优雅的解决方案。
    【解决方案2】:

    列表中有一个重复的元素84,因此array.index 不能像您预期的那样工作。此外,您的代码具有二次复杂度,这不是必需的。

    要以最少的编辑量来修复您的代码,它看起来像这样:

    array = [-37,-36,-19,-99,29,20,3,-7,-64,84,36,62,26,-76,55,-24,84,49,-65,41] 
    print sum(array[i] for i in range(len(array)) if i % 2 == 0)*array[-1] if array != [] else 0
    

    【讨论】:

    • 是的,这就是原因
    • 来自文档array.index(i) Return the smallest i such that i is the index of the first occurrence of x in the array。 `
    • 我明白了。这是导致错误的重复元素 84。谢谢!
    【解决方案3】:
    >>> sum(x for i, x in enumerate(array) if not i % 2)*array[-1] 
    1968
    

    使用内置的enumerate 函数,因为您的列表中有重复的元素,并且list.index(x) 返回等于x第一个 元素的索引(如在the documentation)。另请查看enumerate 上的文档。

    【讨论】:

    • 该死,你的速度更快。你可以改用if not i % 2,它更像 Pythonic。
    • 我认为 array[::2] 更 Pythonic :)
    • @traceur 我认为这是一个有趣的解决方案,它使用带有条件的for
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-29
    • 2012-05-18
    • 1970-01-01
    • 1970-01-01
    • 2022-11-03
    相关资源
    最近更新 更多