【问题标题】:Applying modulo to all elements of a python list and getting some correct some incorrect elements将模数应用于python列表的所有元素并得到一些正确的一些不正确的元素
【发布时间】:2017-02-13 09:07:31
【问题描述】:

我正在实现一个函数,它可以减少列表中所有元素的模 3。这是我所拥有的:

def reduceMod3(l):
    for i in l:
        l[i] = l[i] % 3
    return l

当我在 L = [1,2,3,4,5,6,7,8,9] 上调用此函数时,我得到:

L = [1, 2, 0, 4, 2, 6, 1, 8, 0]

这是为什么?我想弄清楚,但我很着急。谢谢。

【问题讨论】:

    标签: python list loops


    【解决方案1】:

    当您编写for i in l 时,您访问的是列表的每个元素,而不是索引。相反,你应该写

    for i in range(len(l)):
    

    你也可以用列表推导解决这个问题:

    return [item % 3 for item in l]
    

    【讨论】:

    • [... for i in l] 中称它为i 很奇怪,因为i 通常是(并且确实在这里用作)索引变量。
    • 我想这是个人喜好问题。我通常使用 i,j,x,y 之类的名称来索引列表推导。
    • 对,但它不是索引。你知道这有多令人困惑,对吧? :P YMMV,这并没有,但它只是令人困惑,尤其是由于元素和索引之间的混淆而被问到的问题的答案。
    • 很公平,为了清楚起见我会改变它
    【解决方案2】:

    您的列表分配已关闭,l[i] 不是说“等于i 的值”而是“在列表l 中的位置i”。您也不想在迭代列表时修改它。

    我认为这更符合您的要求。创建传入列表的 mod3 项的新列表。

    def reduceMod3(l):
        return [i % 3 for i in l]
    

    【讨论】:

    • 在迭代列表时修改列表实际上并没有什么坏处,只要您不从列表中追加或删除。
    • @AdamSmith 你是对的。我一头雾水地想可能出了点问题,因为他错误地将l[i] 设置为i 中的项目,但如果发生这种情况,这将更多地导致IndexError 出现问题。
    猜你喜欢
    • 2013-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-23
    • 2021-09-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多