【问题标题】:A way to convert "1, 2, 3, 4, 5, 6, 7, 8, 9" into "-4, -3, -2, -1, 0, 1, 2, 3, 4"一种将“1,2,3,4,5,6,7,8,9”转换为“-4,-3,-2,-1,0,1,2,3,4”的方法
【发布时间】:2020-03-15 00:58:37
【问题描述】:

我有这个基本循环:

for x in range(1, len(testList) + 1)
        print(x, end=", ")

假设testList 的长度为9。那么,这将输出1, 2, 3, 4, 5, 6, 7, 8, 9。问题是,我希望它打印出-4, -3, -2, -1, 0, 1, 2, 3, 4。有人可以告诉我一种方法吗?

注意:当testList 的长度发生变化时,我不能只减去5 或常数。

【问题讨论】:

  • 如果testList 的长度为 10,你想要什么?
  • -3.5, -2.5, -1.5, -0.5, 0.5, 1.5, 2.5, 3.5, 4.5 如果长度为 10
  • 只有 9 个值;你的意思是从-4.5 开始吗?
  • 所以你想做 x - (len(testList)+1)/2 ?
  • 是的,@Nick,哎呀

标签: python loops math


【解决方案1】:

所以,如果你想通过与列表长度相关的东西来调整起点,只需使用列表的长度来计算增量,例如:

for x in range(len(testList)):
    print(x - len(testList) // 2, end=", ")

您必须针对边缘情况进行整理,例如如果列表有偶数个元素该怎么办,但这仍然是相同的概念,使用长度来计算如何更改每个元素。

您还应该意识到,您会得到一个带有该代码的结束分隔符,并且末尾没有换行符。请参阅下面的解决方法。

这只是作为如何调整起点的示例。


当然,你总是可以选择更 Pythonic 的:

>>> print(", ".join([str(n - len(testList) // 2) for n in range(len(testList))]))
-4, -3, -2, -1, 0, 1, 2, 3, 4

不过,如果您是开始使用 Python,那可能不是一个好主意 :-)

随着你变得更高级,了解这些事情很高兴,但这并不一定有助于学习语言。下面的解释真的是为新的 Python 开发者准备的,如果你已经了解列表推导,请随意忽略。

它还有一个优点是不把分隔符放在最后一项之后,工作原理如下:

  1. for 循环为您提供0..n-1 的项目序列,其中n 是列表长度。
  2. n-len(x)//2 会调整这些值,为您提供一个(大致)以零为中心的范围。
  3. str() 将这些转换为字符串。
  4. 周围的[] 字符将整个序列变成一个列表。
  5. join 将这些列表项连接在一起,", " 作为分隔符。

如果您希望它以偶数或奇数列表长度恰好围绕零居中(正如您在评论中提到的那样),正确的说法是:

print(", ".join([str(n + 0.5 - len(testList) / 2) for n in range(len(testList))]))

您可以通过以下成绩单确认:

>>> for i in range(10):
...     testList = [0] * i
...     print(i, ":", ", ".join([str(n + 0.5 - len(testList) / 2) for n in range(len(testList))]))
...
0 :
1 : 0.0
2 : -0.5, 0.5
3 : -1.0, 0.0, 1.0
4 : -1.5, -0.5, 0.5, 1.5
5 : -2.0, -1.0, 0.0, 1.0, 2.0
6 : -2.5, -1.5, -0.5, 0.5, 1.5, 2.5
7 : -3.0, -2.0, -1.0, 0.0, 1.0, 2.0, 3.0
8 : -3.5, -2.5, -1.5, -0.5, 0.5, 1.5, 2.5, 3.5
9 : -4.0, -3.0, -2.0, -1.0, 0.0, 1.0, 2.0, 3.0, 4.0

【讨论】:

  • 实际上,对于第一个示例,您必须将其更改为x - 1,否则您将获得比平时少一个的数字。
  • 第一个例子实际上只是为了举例说明如何根据长度进行调整。一个更有用的例子是在最后一节中,它从正确的值开始,包括满足列表长度为偶数的半整数。
猜你喜欢
  • 2023-03-03
  • 1970-01-01
  • 2016-06-27
  • 1970-01-01
  • 1970-01-01
  • 2020-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多