【问题标题】:How to compare the last index to the first in a list whilst iterating, or looping如何在迭代或循环时将最后一个索引与列表中的第一个索引进行比较
【发布时间】:2016-05-03 20:17:16
【问题描述】:

我想在循环或映射步骤中将最后一个索引与第一个索引进行比较。我想要这样的东西使用'map':

def difference(angle):
    return angle.next() - angle

angles = [90,180,270]
diff = list(map(difference,angles))
print(diff)

或者像这样使用'for'循环:

angles = [90,180,270]
diff = []
for angle in angles:
    diff.append(angles.next()-angle)

print(diff)

它们不起作用。您不能在 int 类型上调用 .next()

这确实有效,但看起来很乱:

angles = [90,180,270]
i = 0
diff = []
angles.append(angles[0])
while i <len(angles)-1:
    diff.append(angles[i+1]-angles[i])
    i += 1

print(diff)

有没有更简洁的解决方案?我觉得我不必将第一个索引附加到末尾来执行此操作。

【问题讨论】:

  • 所以你想要每两个相邻列表项的差异,但是在末尾循环,以便最后一项也正好在第一项之前?
  • 是的。抱歉,如果不清楚。最后一段代码做了我想要的。

标签: python-3.x


【解决方案1】:

使用zip 将原始列表和移动了一项的相同列表合并:

diff = [left-right for left, right in zip(angles, angles[1:]+angles[:1])]

对于angles = [90,180,270],结果将是[-90, -90, 180]


或者反过来(从右边减去左边的值):

diff = [right-left for left, right in zip(angles, angles[1:]+angles[:1])]

对于angles = [90,180,270],结果将是[90, 90, -180]


如果您不想要,也可以使用 abs(...) 消除该符号:

diff = [abs(left-right) for left, right in zip(angles, angles[1:]+angles[:1])]

对于angles = [90,180,270],结果将是[90, 90, 180]

【讨论】:

  • 是的。这太棒了。即使我的示例给出了[90,90,-180],我也可以接受负号。
  • @Jordan 在这种情况下,您只需交换 leftright
  • 是的。那也行。在我的特殊情况下,我实际上使用的是math.fabs(left-right)。或类似的东西。
  • @JordanStewart 在 那个 的情况下,我会使用内置的 abs(...) 而不是 math.fabs(...)。第一个应该更快并且更灵活。 --> Difference between abs() and math.fabs()
【解决方案2】:

另一种方法:

diff = []
while i <len(angles)-1:
    diff.append(angles[i+1]-angles[i])
    i += 1
diff.append(angles[len(angles)-1]-angles[0])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-16
    • 2020-08-12
    • 2020-04-08
    • 1970-01-01
    • 1970-01-01
    • 2021-02-18
    • 2018-04-15
    • 2021-12-28
    相关资源
    最近更新 更多