【问题标题】:Why does list index -0 form an empty list?为什么列表索引 -0 形成一个空列表?
【发布时间】:2023-03-06 06:29:01
【问题描述】:

想象一个列表:

a = [1, 2, 3, 4, 5, 6, 7, 8]

您只想通过以下方式迭代并打印此列表中的切片:

for i in range(len(a)-2):
    print(a[2: -i])

这会产生:

[]
[3, 4, 5, 6, 7]
[3, 4, 5, 6]
[3, 4, 5]
[3, 4]
[3]

在这里,我注意到将列表索引指定为a[2: -0] 会返回一个空列表。 我原以为这会返回索引 2 以上的所有数字。 这种行为有简单的解释吗?

回到期望结果的示例:

[3, 4, 5, 6, 7, 8]
[3, 4, 5, 6, 7]
[3, 4, 5, 6]
[3, 4, 5]
[3, 4]
[3]

if 语句的引入似乎是处理此问题的笨拙方法。如:

for i in range(len(a)-2):
    if i == 0:
        print(a[2:])
    else:
        print(a[2:-i])

有没有更好的办法?

【问题讨论】:

  • 据我所知,对于 python,它是 0 还是 -0 并不重要,因此 a[2 : -0] 被改写为 a[2 : 0],实际上是一个空列表
  • 确实,对于整数-0 0。浮点数对-0.0 有一个单独的值,但您不能将浮点数用于索引列表。
  • >>> -0 == 0 真

标签: python list indexing


【解决方案1】:
for i in range(len(a)-2):
    print(a[2: -i or None])

这可以使它看起来整洁。但正如@Akshat2249 所建议的那样,a[2:0] 应该什么都不返回。

【讨论】:

  • 另一种选择是自己做索引数学,而不是使用负数:a[2:len(a)-i]
【解决方案2】:

有几种方法可以解决此问题,-00,这会将它放在您想要的切片列表的错误末尾。

正如 Vishal Dhawan 所提议的那样,一种选择是用 None 替换 -0 值。之所以有效,是因为切片中的None 意味着“继续切片直到列表末尾”。

另一种选择是自己计算索引,而不是使用负索引从末尾开始计数。你会想要a[2:len(a)-i]

最好的选择是更改您正在循环的range,以便它直接为您提供所需的切片结束索引,而无需任何额外的数学运算。 Danil Melnikov 的回答几乎做到了这一点,但它的range 调用存在一些错误,因此它产生了错误的输出。试试:

for i in range(len(a), 2, -1):
    print(a[2: i])

【讨论】:

    【解决方案3】:
    a = [1, 2, 3, 4, 5, 6, 7, 8]
    for i in range(len(a)-1, 0, -1):
        print(a[2: i])
    

    愿意:

    [3, 4, 5, 6, 7, 8]
    [3, 4, 5, 6, 7]
    [3, 4, 5, 6]
    [3, 4, 5]
    [3, 4]
    [3]
    

    当您使用列表切片时,它具有从 2 开始到 0 的逻辑,但如果起点 > 终点循环结束,我们可以指定步长,-1 或 +1 [2:0:-1 ]

    【讨论】:

    • 您的range 不太正确。你想要range(len(a), 2, -1),或者你会跳过你想要的第一个输出,并在最后添加两个额外的空切片。
    猜你喜欢
    • 1970-01-01
    • 2015-04-25
    • 1970-01-01
    • 2021-11-04
    • 1970-01-01
    • 1970-01-01
    • 2017-06-19
    • 2021-06-17
    • 2022-01-05
    相关资源
    最近更新 更多