【问题标题】:break a for loop without resetting its index in Python在 Python 中中断 for 循环而不重置其索引
【发布时间】:2021-03-30 13:16:05
【问题描述】:
no_elements = int(input())
seq = list(map(int, input().split()))
new_seq = []
diff = []
diff_opp = []

new_seq.append(seq[0])

for element in range(no_elements - 1):
    diff.append(seq[element + 1] - seq[element])

for element in range(no_elements - 1):
    diff[element] = -diff[element]


for diff_element in range(0, len(diff)):
    print(diff_element)
    for i in range(4):
            print(i)
            new_seq.append(diff[diff_element] + new_seq[i])
            break


print(new_seq)

实际上,我希望我的嵌套(第 2 次)循环应该只执行 1 次并在每次执行时都中断,另外我还希望每次我说中断时不会重置 i 的值,因为我正在使用一个列表(new_seq),因为我不想使用相同的数字进行相同的工作,而是希望 i 的值不会改变,我可以对整个列表进行逻辑处理。

顺便说一句,我想计算列表中每两个元素之间的差异,然后找到它的倒数(符号的倒数)并找到一个从原始序列的第一个元素开始的新序列。

这是真正的问题。☝

【问题讨论】:

  • 如果您能添加一些预期的输入和输出以使您更清楚您想要实现的目标,那将会很有帮助。
  • 没错,不要使用input(),而只是明确给出数字作为例子,并给出预期的输出。这样你的问题就不清楚了
  • 请看我编辑的问题
  • 如果您想要使用 stdlib 的 functools.reduce 获得不可读的单行,您可以使用 reduce(lambda x, y: x + [x[-1] + y], [-(j - i) for i, j in zip(seq[:-1], seq[1:])], [seq[0]])

标签: python python-3.x loops for-loop nested-loops


【解决方案1】:

我已根据您的新信息编辑了我的第一个答案

seq = [-321, 524, 12, 0, 924, -658, -2]
diff = list()

for ii, element in enumerate(seq[1:]):
    diff.append(-(element - seq[ii]))

new_value = seq[0]
new_seq = [new_value]
for value in diff:
    new_value += value
    new_seq.append(new_value)

print(seq)
print(diff)
print(new_seq)

这将给出输出

[-321, 524, 12, 0, 924, -658, -2]
[-845, 512, 12, -924, 1582, -656]
[-321, -1166, -654, -642, -1566, 16, -640]

输出与您的示例相对应

为了完整起见,还有 numpy 版本:

import numpy as np
seq = np.array([-321, 524, 12, 0, 924, -658, -2])
diff = -np.diff(seq)
new_seq = np.cumsum(np.hstack([seq[0], diff]))

【讨论】:

  • 谢谢你,这有帮助。有时间就学 numpy 似乎真的很简单。
  • 学习 numpy 绝对值得你花时间。正如我之前提到的,与纯 Python 相比,使用 numpy 进行数值运算的速度大约快 100 倍。在这种特殊情况下,运行时间可能会更慢,因为加载模块需要时间,但对于较大的数组,这很容易得到补偿。当你使用 Numpy 时,通常认为 Python 慢的核心论点是无稽之谈:它和 C 一样快,因为它主要是用 C 编写的
【解决方案2】:

据我了解,您只想运行一次内部循环循环并为下一次迭代保留索引 i?

diff[0] + new_seq[0]
diff[1] + new_seq[1]
diff[2] + new_seq[2]
diff[3] + new_seq[3]
diff[4] + new_seq[0]  <- reset i
..

然后:

i = -1
for element in diff:
    i = (i + 1) % 4
    new_seq.append(element + new_seq[i])

另一种可能的解释是你想要

diff[0] + new_seq[0]
diff[1] + new_seq[0]
diff[2] + new_seq[0]
..
diff[0] + new_seq[1]
diff[1] + new_seq[1]
..

在这种情况下,您需要翻转循环:

for i in range(4):
    for element in diff:
        new_seq.append(element + new_seq[i])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-09
    • 2014-03-22
    相关资源
    最近更新 更多