簡體   English   中英

將列表包裝為切片操作

[英]Wrapping around a list as a slice operation

考慮以下簡單的python代碼

>>> L = range(3)
>>> L
[0, 1, 2]

我們可以對這個數組進行切片,如下所示:

>>> L[1:3]
[1, 2]

有沒有辦法通過向左移動來環繞上面的數組

[1, 2, 0]

通過簡單地使用切片操作?

向左旋轉n元素(或向右旋轉負 n):

L = L[n:] + L[:n]

請注意, collections.deque支持旋轉 使用它而不是列表可能會更好。

剩下:

L[:1], L[1:] = L[-1:], L[:-1]

對:

L[-1:], L[:-1] = L[:1], L[1:]

在我看來,沒有辦法,除非您同意如上所示剪切和連接列表。 要進行您描述的包裝,您需要更改起始索引和結束索引。

  • 正的起始指數會削減一些初始項目。
  • 負起始索引為您提供一些尾部項目,再次切割初始項目。
  • 積極的整理指數削減了一些尾部項目。
  • 負整理指數為您提供一些初始項目,再次切割尾部項目。

這些的組合都不能提供尾部項目后跟初始項目的包裝點。 所以不能創建整個事物。

存在多種解決方法。 如果您需要順序訪問(例如在循環中),請參閱上面的答案,另請參閱itertools.islice.chain以了解無復制順序方法。

如果您不太依賴於精確的切片語法,您可以編寫一個函數來產生所需的輸出,包括包裝行為。

例如,像這樣:

def wrapping_slice(lst, *args):
    return [lst[i%len(lst)] for i in range(*args)]

示例輸出:

>>> L = range(3)
>>> wrapping_slice(L, 1, 4)
[1, 2, 0]
>>> wrapping_slice(L, -1, 4)
[2, 0, 1, 2, 0]
>>> wrapping_slice(L, -1, 4, 2)
[2, 1, 0]

警告:您不能在切片分配的左側使用它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM