Python 切片和迭代

切片和迭代


切片


假設已有列表或元組,想從其中取部分元素,該如何操做?python

通常狀況下,首先想到的會是經過索引,或者經過循環語句配合條件取值。微信

首先說一下索引取值,Python 索引默認是從 0 開始的。假設給定列表以下:app

>>> L = ['Lei', 'Allen', 'Pony', 'Jacky']

如今須要取出前面兩個元素,嘗試使用索引取值,也就是取索引爲 0 和 1 的元素:函數

>>> L[0], L[1]
('Lei', 'Allen')

雖然這種方法看起來可行,但如果取值的範圍大到必定的程度時,屆時再用這個辦法就不行。.net

那考慮使用循環的方式:code

>>> lst = []
>>> n = 2
>>> for i in range(n):
...     lst.append(L[i])
...
>>> lst
['Lei', 'Allen']

這裏使用循環的方法,只須要改動 n 的大小,就可以改變取值的範圍。對象

上面循環的方法,雖然可以指定範圍實現取值,可是相對來講也比較繁瑣。Python 提供了切片(Slice)操做的概念,能簡化這種操做。blog

仍是上面的的問題,如今用切片的方法來實現:索引

>>> L[0:2]
['Lei', 'Allen']

上面的代碼相對於循環,能夠說很是簡潔。L[0:2] 表示的是,從索引 0 開始取值,直到索引爲 2 爲止(這裏不包含索引爲 2)。所取的索引爲 01,也就是須要取的兩個元素。字符串

這裏若前面的索引是 0,能夠省略:

>>> L[:2]
['Lei', 'Allen']

也能夠取從索引 1 開始的兩個元素值:

>>> L[1:3]
['Allen', 'Pony']

這裏再說一個索引的知識,索引能夠爲負數。索引爲 -1 的時候,表示的是最後一位元素。取負數值時,是從最後往前以 1 的跨度遞減:

>>> L[-1]
'Jacky'
>>> L[-2]
'Pony'

切片也支持這種索引的操做,好比取後面兩個元素:

>>> L[-2:]
['Pony', 'Jacky']

這裏取到末尾,最後部分能夠省略(也就是冒號後面能夠不寫索引值)

切片能夠從取前面 n 個元素,取後面 n 個元素,一樣也能夠在中間取值。其實前面 L[1:3] 就是從之間取值,這裏可能不太明顯。

從新生成一個 0 - 59 的數字列表:

>>> L = list(range(60))
>>> L
[0, 1, 2, ..., 59]

取前面 5 個元素:

>>> L[:5]
[0, 1, 2, 3, 4]

取後面 5 個元素:

>>> L[-5:]
[55, 56, 57, 58, 59]

取 15 開始到 25 的數(不包含 25)

>>> L[15:25]
[15, 16, 17, 18, 19, 20, 21, 22, 23, 24]

在前面 10 個數字中,隔 2 取一個元素:

>>> L[:10:2]
[0, 2, 4, 6, 8]

在全部的數中,隔 5 取一個元素:

>>> L[::5]
[0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55]

還有一種狀況,就是 L[:],這種表示原樣複製一個列表:

>>> L[:]
[0, 1, 2, ..., 59]

tuple 和字符串均可以使用切片操做,只不過這兩種類型在切片以後返回的也是原類型。好比:

>>> _tuple = (0, 1, 2, 3, 4, 5)
>>> _str = '012345'
>>> _tuple[0:2]
(0, 1)
>>> _str[:2]
'01'

這裏元組進行切片操做返回的依然是元組,字符串也是,返回的依舊是字符串。

迭代


若是給定一個列表,咱們用 for 循環來遍歷這個列表,這種遍歷就稱之爲迭代

在 Python 中,迭代是經過 for ... in ... 來完成的,上面的循環方法用的就是這個方式。

在 Python 中,for 與其餘語言不太相同,它不只僅能做用於元組或者列表,還能夠做用於其餘可迭代對象中。

在下面這篇文章中,介紹過可迭代對象的概念,能夠回顧下。

Python 生成器和迭代器

好比字典 dict,它並無索引的概念,但它是可迭代對象,一樣可以使用 for 循環迭代:

>>> _dict = {'a': 1, 'b': 2, 'c': 3}
>>> for key in _dict:
...     print(key)
...
a
b
c

普通字典存儲方式並非按照順序存儲的,因此輸出結果的順序可能不同。默認狀況下,遍歷字典獲得的結果是鍵(key)。

如果須要迭代值(value),可使用 for value in _dict.values();若是須要同時迭代鍵值的話,可使用 for key, value in _dict.items()

字符串也是可迭代對象,也可使用 for 循環:

>>> for ch in "abc":
...     print(ch)
...
a
b
c

因此使用 for 循環的話,只要做用的是可迭代對象,就可以正常運行。至於判斷對象是不是可迭代對象,這個問題在上面說起的 《Python 生成器和迭代器》 的文章中已經說明了,這裏就再也不贅述。

for 循環在進行迭代的時候,可以輸出元素值對應的索引。這裏要搭配內置函數 enmuerate 。這個函數可以將可迭代對象與索引組合一個序列:

>>> for i, elem in enumerate(['a', 'b', 'c']):
...     print(i, elem)
...
0 a
1 b
2 c

以上就是關於切片和迭代的內容。

歡迎關注微信公衆號《書所集錄》
相關文章
相關標籤/搜索