我有一個字串string = 'cbAfeDihGlkJonMrqPutS',我想遍歷它以產生'AbcDefGhiJklMnoPqrStu'.
我正在使用以下 for 回圈來實作'DefGhiJklMnoPqrStu,但是Abc缺少預期。
for i in (range(0, len(string), 3)):
print(string[i 2 : i-1 : -1], end='')
由于-1在我的結束元素中 : i-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]?
uj5u.com熱心網友回復:
最優雅的方法可能是使用''.join()和理解將您已經想到的回圈壓縮成一行。
string = 'cbAfeDihGlkJonMrqPutS'
print(''.join(string[i:i 3][::-1] for i in range(0, len(string), 3)))
# AbcDefGhiJklMnoPqrStu
您可能認為[::-1]通過執行 like可以去掉多余的部分string[i 2:i-1:-1],但正如您所觀察到的,這會切斷字串中的第一個字符。這是切片語法的一個怪癖,切片的end邊界是排他的而不是包含的,但同時索引-1指的是字串的結尾而不是“開頭之前的字符”(這將超出,比如說,Java,但我們不會有這個問題)。據我所知,沒有辦法解決這個問題。
您也可以嘗試使用reversed()而不是[::-1],但我認為這不會使它變得更簡單或更快捷:
print(''.join(c for i in range(0, len(string), 3) for c in reversed(string[i:i 3])))
編輯:作為@不說話只是代碼的注釋中指出,它實際上是可以規避的問題,將None作為一個切片的第二個引數將會使切片進行到哪個串列的末尾是合適的(直到這個評論我不知道這個)。考慮到這一點,我們確實可以只用一個切片來做這件事:
print(''.join(string[i 2:i-1 if i else None:-1] for i in range(0, len(string), 3)))
# AbcDefGhiJklMnoPqrStu
這有點不雅,但它似乎有效,并且比上面更符合您的要求。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/335722.html
