【问题标题】:How do I sum all integers in a list multiplied by their indexes?如何将列表中的所有整数乘以它们的索引相加?
【发布时间】:2020-11-06 19:05:43
【问题描述】:

目标是返回列表中所有项目的总和,其中每个项目都乘以它的索引。

我的代码适用于一些测试用例;但是,它不适用于其他人。为什么不呢?

def index_multiplier(lst):
    total = 0
    if len(lst) >= 1:
        for num in lst:
            x = num*(lst.index(num))
            total += x
        return total
    else:
        return 0

第一个不起作用的测试用例: Test.assert_equals(index_multiplier([4, 4, 2, 2, -4]), -2)

我的代码返回 -8

【问题讨论】:

    标签: python list indexing sum integer


    【解决方案1】:

    为什么不只是一个简单的列表理解?

    x = [4, 4, 2, 2, -4]
    out = sum([i*y for i,y in enumerate(x)])
    

    输出:

    -2
    

    edit - 可以不带方括号使用:

    out = sum(i*y for i,y in enumerate(x))
    

    【讨论】:

    • +1 这可能是执行此操作的规范方法。请注意:您可以删除 [ ] 以创建一个避免创建新列表的生成器。
    【解决方案2】:

    .index 将始终返回元素第一次出现的索引。所以lst.index(num) 将为您列表中的第一个和第二个4 返回0

    在循环遍历列表时使用enumerate(lst) 来跟踪索引。

    def index_multiplier(lst):
        total = 0
        if len(lst) >= 1:
            for i, num in enumerate(lst):
                x = num * i
                total += x
            return total
        else:
            return 0
            
    print(index_multiplier([4, 4, 2, 2, -4])) # this will print -2.
    

    如果您出于某种原因不想使用enumerate,您可以像这样创建自己的计数器:

    def index_multiplier(lst):
        total = 0
        if len(lst) >= 1:
            i = 0
            for num in lst:
                x = num * i
                total += x
                i += 1
            return total
        else:
            return 0
    

    【讨论】:

    • 所以 enumerate() 需要两个可迭代对象并为列表中的每个项目分配一个唯一编号?
    • enumerate 需要 1 个可迭代对象,并返回 2 个值。第一个是索引,第二个是该索引处的值。如果您不想使用枚举,我在帖子中添加了另一个示例。
    • 不是“i”和“num”两个可迭代对象吗?
    • @Mythic-ctrl 不。可迭代是您可以迭代的东西,即循环。在我们的例子中,iterable 是lst,因为您正在循环它。 inum 只是我们用来存储关于我们在可迭代 lst 中的位置信息的变量。希望这是有道理的。
    【解决方案3】:

    宣传itertools.starmap 的机会并不多,所以我只是将其作为一种简洁而有趣的方式来提及。 starmap 将使用 operator.mul() 将来自 enumerate() 的索引/值对相乘,然后 sum() 会:

    from operator import mul
    from itertools import starmap
    
    l  = [4, 4, 2, 2, -4]
    sum(starmap(mul, enumerate(l)))
    # -2
    

    【讨论】:

      猜你喜欢
      • 2014-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-09
      相关资源
      最近更新 更多