【问题标题】:Python : include last element (where i=0) when iterating in reversePython:反向迭代时包含最后一个元素(其中i = 0)
【发布时间】:2021-10-23 02:27:15
【问题描述】:

我有一个字符串string = 'cbAfeDihGlkJonMrqPutS',我想遍历它以产生'AbcDefGhiJklMnoPqrStu'

我正在使用以下 for 循环来实现 'DefGhiJklMnoPqrStu,但是缺少预期的 Abc

for i in (range(0, len(string), 3)):
    print(string[i+2 : i-1 : -1], end='')

这似乎是一个问题,因为我的结束元素: i-1 : 中的-1,但是我想知道为什么反向迭代(步长为-1)并使用:i-1: 来捕获第一个元素(其中 i=0) 与向前迭代和使用 : i+1 : 捕获最后一个元素的工作方式不同。

我能够实现我想要的解决方案

for i in (range(0, len(string), 3)):
    print(string[i:i+3:1][::-1], end='')

但是向前迭代和向后打印似乎是一种笨拙的方法。必须添加[::-1] 似乎是一个多余的步骤,[i+2 : i-1 : -1] 是否有效。

除了[i:i+3:1][::-1] 之外,还有更简洁的方法吗?

【问题讨论】:

  • ''.join(sorted(list(string), key=str.lower))
  • ''.join(sorted(string , key=str.casefold)) 应该会产生你想要的结果。

标签: python for-loop range


【解决方案1】:

最优雅的方法可能是使用''.join() 和一个理解来将你已经想出的循环压缩成一行。

string = 'cbAfeDihGlkJonMrqPutS'
print(''.join(string[i:i+3][::-1] for i in range(0, len(string), 3)))
# AbcDefGhiJklMnoPqrStu

你认为你可以通过像string[i+2:i-1:-1] 这样的操作来摆脱多余的[::-1],但正如你所观察到的,这会切断字符串中的第一个字符。这是切片语法的一个怪癖,切片的end 边界是独占 而不是包容,但同时-1 的索引指的是字符串的结尾而不是'the开始之前的字符'(这在 Java 中是超出范围的,但在其中我们不会遇到这个问题)。据我所知,没有办法解决这个问题。

您也可以尝试使用reversed() 而不是[::-1],但我认为这不会更简单或更快:

print(''.join(c for i in range(0, len(string), 3) for c in reversed(string[i:i+3])))

编辑:正如@don't talk just code 在注释中指出的那样,实际上可以规避问题的,因为将None 作为切片的第二个参数将使切片继续到列表的任何一端是合适的(直到这个评论我不知道这一点)。考虑到这一点,我们确实可以只用一个片段来做这件事:

print(''.join(string[i+2:i-1 if i else None:-1] for i in range(0, len(string), 3)))
# AbcDefGhiJklMnoPqrStu

这有点不雅,但它似乎工作,并且会比上面的更多。

【讨论】:

  • 我当然会认为您确认“没有办法解决这个问题”是一个令人满意的答案。令人遗憾的是,这个案例通过直观切片的裂缝而失败。谢谢
  • @ZwiTrader 您可以使用i-1 if i else None 而不是i-1。或者保留i-1,但使用range(-len(string), 0, 3),将负数加倍。
  • @don'ttalkjustcode TIL 那是一回事。我已经相应地编辑了我的答案,谢谢你提出这个问题
  • 是的,None 只是默认值,相当于省略一个值 (demo)。您是否也尝试过负范围?这很不寻常,但也很简单,而且速度可能稍快。
  • 感谢这两个建议@don't talk just code。了解i-1 if i else None 作为一个选项很有趣,但正如你所说的“加倍负数”是紧凑的,并且首先符合我的要求。完美。
猜你喜欢
  • 2013-02-20
  • 1970-01-01
  • 2011-08-21
  • 2019-08-15
  • 1970-01-01
  • 2011-02-10
  • 2022-10-14
  • 2011-10-28
  • 2015-07-26
相关资源
最近更新 更多