【问题标题】:Can this loop be done in a list comprehension?这个循环可以在列表理解中完成吗?
【发布时间】:2022-01-02 22:25:33
【问题描述】:

来自这个问题 Adding the last position of an array to the same array

我很好奇上述循环是否可以在列表理解中完成?

array = [3,4,2,5,4,5,8,7,8,9]
value = 10

for i in range(1,10):
   array[i] = array[i-1] + value

我想也许是海象运算符。

我的尝试给了我一个错误,导致cannot-use-assignment-expressions-with-subscript

[array[count] := val if count == 0 else array[count] := array[count-1] + value for count,val in enumerate(array)]

有什么想法吗?

【问题讨论】:

  • 列表推导会创建一个 new 列表,因此不清楚您为什么要使用它。
  • [3, 13, 23, 33, 43, 53, 63, 73, 83, 93] 的代码输出吗?只取决于第一项?
  • list(range(array[0], array[0] + len(array) * value, value))
  • Amirreza Noori,据我从 1.linked question 中了解。
  • jonsharp,如前所述,我很好奇。

标签: python list-comprehension walrus-operator


【解决方案1】:

for 循环仅使用第一个元素并用全新的项目覆盖 array。使用下面的列表理解可以实现完全相同的结果:

array = [array[0] + i*value for i in range(len(array))]

输出:

[3, 13, 23, 33, 43, 53, 63, 73, 83, 93]

【讨论】:

    【解决方案2】:

    我们可以观察到,如果我们得到的数组是result,那么result[i] = array[0] + i * value

    例如:

    • result[0] = array[0]
    • result[1] = result[0] + value = array[0] + 1 * value
    • result[2] = result[1] + value = array[0] + 2 * value

    从代码中可以看出,这一般可以表示为:

    • result[0] = array[0]
    • result[i] = result[i - 1] + valuei > 0

    那么,列表推导变为:

    result = [array[0] + i * value for i in range(len(array))]
    

    【讨论】:

    • BrokenBenchmark,抱歉,这与上述循环的结果不同。
    • 已编辑,感谢您的关注。
    【解决方案3】:

    发生错误是因为array[count] 不是变量标识符,而是array 列表中的一个位置,因此您无法为其分配任何内容。

    相反,您可以使用以下...

    array = [3,4,2,5,4,5,8,7,8,9]
    value = 10
    
    res = [(first_val := array[count]) if count==0 else array[count-1]+(count*value) for count,val in enumerate(array)]
    
    print(res)
    print(first_val)
    

    输出:-

    [3, 13, 14, 12, 15, 14, 15, 18, 17, 18]
    3
    

    【讨论】:

    • MK14,我用另一个 lc 得到了你的结果。但是,这与上述循环的结果不同。
    • 我刚刚运行了该代码并得到了[3, 13, 23, 33, 43, 53, 63, 73, 83, 93]
    • @RSale,对不起,我的错...
    • 一切都好......
    • @RSale 发现了bug,在array[count-1] + value这一行,这里直接取主数组中的元素,但是在你的代码中,元素加值后不断更新,因此,这就是它给出不同答案的原因。
    猜你喜欢
    • 2013-10-11
    • 1970-01-01
    • 2021-08-21
    • 2014-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-13
    相关资源
    最近更新 更多