Some tricks for the list slicing in Python.

主要是想查 Python 要怎麼漂亮的寫 prepend 一個 item 到 list 時
找到了這篇 append integer to beginning of list in python - Stack Overflow

主要就三種寫法:

  • 第一種,把 item 塞進一個 list 然後再加上原本的 list
l = [item] + l  
  • 第二種,用 built-in 的 list.insert
l.insert(0, item)  
  • 第三種,評分最低、也是引起我好奇的寫法
l[:0] = [item]  

試了一下,發現真的可以這樣做,但在這之前從來沒看過這寫法。
於是就去翻了一下官方的文件
5. Data Structures — Python 3.4.3 documentation
發現裡頭有類似的東西,以前都沒仔細看。

list.append(x)  
Add an item to the end of the list. Equivalent to a[len(a):] = [x].  

list.extend(L)  
Extend the list by appending all the items in the given list. Equivalent to a[len(a):] = L.  

雖然只有 append 的部分,但可以看出有點相似,
跟 Apua 經過一番討論後,整理了一下重點:


  • prepend
l[:0] = [x]  

等於

l.insert(0, x)  

  • list.append
l[len(l):] = [x]  

等於

l.append(x)  

等於

l.insert(len(l), x)  

  • list.extend
l[len(l):] = [a, b, c]  

等於

l.extend([a, b, c])  

prepend 和 append 的變化型都沒啥特別的,
用 insert 和 append 的可讀性其實比較高。
主要是 extend 的變化型有些有趣的東西可以討論。
例如:

l[i:i] = [a, b, c]  

這會在 l 原本的的 i-1 和 i 中 insert a, b, c 這三個 elements,
可以看作是可 insert 任意位置的 list.extend,
原本的 extend 只能把 iter 展開後加到 l 的最後面,
但這樣的寫法突破了這種限制。
例如:

>>> l = [1, 2, 3, 4, 5]  
>>> l[2:2] = [-1, -2, -3]  
>>> l  
[1, 2, -1, -2, -3, 3, 4, 5]  

然後也可以把 l[i:i] = [a, b, c] 的兩個 i 換成一般正常使用的 slicing 方式,
被 slicing 選擇出來的區段就會直接被 a, b, c 取代掉。
例如:

>>> l = [1, 2, 3, 4, 5]  
>>> l[1:4] = [0, 0, 0]  
>>> l  
[1, 0, 0, 0, 5]  

真的是第一次知道這種神奇的寫法...
Apua 猜測 list 的實作應該是跟 linked list 有關
之後有空的話來仔細看一下 python list 的實作好了


Share


Donation

如果覺得這篇文章對你有幫助, 除了留言讓我知道外, 或許也可以考慮請我喝杯咖啡, 不論金額多寡我都會非常感激且能鼓勵我繼續寫出對你有幫助的文章。

If this blog post happens to be helpful to you, besides of leaving a reply, you may consider buy me a cup of coffee to support me. It would help me write more articles helpful to you in the future and I would really appreciate it.


Related Posts