【问题标题】:Can someone explain why use j –= 1 instead of j += 1?有人可以解释为什么使用 j –= 1 而不是 j += 1 吗?
【发布时间】:2022-01-14 21:51:46
【问题描述】:
given_list = [7, 5, 4, 4, 3, 1, -2, -3, -5, -7]
total = 0
j = len(given_list) - 1
while given_list[j] < 0:
    total += given_list[j]
    j -= 1
print(total)

我没有得到像 j = len(given_list) – 1j –= 1 这样的完整减法运算。我已经记住了,但我还是不太明白。你能逐行解释这段代码吗?

【问题讨论】:

  • 列表的迭代是从列表的末尾到开头进行的。这就是为什么索引从列表的末尾开始并通过在每次迭代中删除 1 而变为 0 的原因。
  • 它正在处理从最后一个元素index=(len(...)-1) 到开头的列表,但它不会在零处停止,所以这可能是一个错误。
  • 循环在given_list 中的第一个非负值处停止,即1 j=5total 是负值 -17 的总和。
  • 列表索引是从零开始的,并且彼此连续,以防您甚至不确定。

标签: python list while-loop subtraction


【解决方案1】:

以下内容可能会使目标更加明显:

given_list = [7, 5, 4, 4, 3, 1, -2, -3, -5, -7]
calc_copy = given_list.copy()
total = 0
# while len(calc_copy) > 0:
while True:
    cur = calc_copy.pop()
    if (cur >= 0):
        break
    total += cur
del calc_copy
print(total)

参考:https://docs.python.org/3/tutorial/datastructures.html#more-on-lists

【讨论】:

  • 不是我的反对意见,但如果有的话,这似乎不那么明显,而且效率也很低。
  • 这就是要点。不过,goal 这个词可能不合适。我试图做的是模仿原始但不涉及索引。虽然有些人/大多数人可能认为它毫无意义,但我不在乎。
【解决方案2】:

在上面的sn-p中: 列表given_list 包含按降序排列的数字。

total 变量初始化为零,变量 j 初始化为 list-1 的长度,即列表中最后一个元素的索引。

while循环从列表末尾开始迭代,检查列表中j变量索引的项目是否小于0。

如果列表项大于或等于零,则循环终止。

在 while 循环内,通过添加由 j 变量索引的列表元素来更新总数,即total += given_list[j],同样等同于total=total+given_list[j]

然后在j -= 1 中将 j 减 1。

一旦循环终止,就会打印变量total

【讨论】:

    【解决方案3】:

    该算法似乎需要一种方法,将列表中的最后一项分离出来并将其相加,并在找到大于零的一项时停止,因此设计看起来相当自然和明显。

    更一般地说,循环从结尾运行到开头没有特定原因,但这并不少见,尤其是在将某物与零进行比较比检查是否已到达结尾更便宜的操作的语言中。您可以等效地遍历列表的开头并跳过项目,直到找到小于零的项目,然后开始将它们相加。对于小型列表,例如在您的示例中,差异应该可以忽略不计。如果您有非常大的列表,也许更好的设计是按升序对它们进行排序。

    因此,这可以很容易地以 Python 方式编写为

    total = 0
    for j in range(len(given_list)):
        if given_list[j] < 0:
            total += given_list[j]
    

    当然可以进一步简化为

    total = 0
    for v in given_list:
        if v < 0:
            total += v
    

    或者干脆

    total = sum(x if x < 0 else 0 for x in given_list)
    

    或者相应地转身向后循环,就像在原来的 range(len(j), 0, -1) 中一样,然后当你找到一个不是负数的值时,你可以 break 退出循环,假设(就像你的代码一样)列表是降序排列。

    【讨论】:

      猜你喜欢
      • 2014-02-11
      • 1970-01-01
      • 2022-11-21
      • 1970-01-01
      • 1970-01-01
      • 2020-04-20
      • 2022-01-25
      • 1970-01-01
      相关资源
      最近更新 更多