一邓线、切片
取一個list或tuple的部分元素是非常常見的操作。比如一個list如下:
>>> L = ['a', 'b', 'c', 'd', 'e']
取前三個元素煌恢,該怎么做骇陈?
笨方法:用循環(huán)實現(xiàn)
r = []
n = 3
for i in range(n):
r.append(L[i])
用此方法十分繁瑣,因此瑰抵,Python提供了切片(Slice)操作符你雌,大大簡化 這種操作。
方括號中包含有三個參數(shù)L[a:b:c]
二汛,其中a表示從第a個索引開始婿崭,b表示到第b個索引結(jié)束拨拓,但不包含b,c表示步長氓栈。
>>> L[0:3]
['a', 'b', 'c']
L[0:3]
表示渣磷,從索引0
開始,直到3
為止授瘦,但不包含3
醋界。即0
, 1
, 2
三個元素
如果第一個索引是0
,還可以省略:
>>> L[:3]
['a', 'b', 'c']
同樣索引值也可以是負(fù)的奥务,表示倒數(shù)切片
>>> L[-2:]
['d', 'e']
>>> L[-2:-1]
['d']
記孜锒馈:倒數(shù)第一個元素的索引是-1
而不是0
。
括號內(nèi)甚至可以什么都不寫氯葬,只寫[:]
這樣就可以原樣復(fù)制一個list:
>>> L[:]
['a', 'b', 'c', 'd', 'e']
tuple也是一種list挡篓,唯一的區(qū)別就是tuple不可變。因此帚称,tuple也可以用切片操作官研,只是操作的結(jié)果仍是tuple:
>>> (0, 1, 2, 3, 4, 5)[:3]
(0, 1, 2)
類似的字符串也可以看成是一種list,每個元素就是一個字符
>>> 'abcdefg'[:3]
'abc'
>>> 'abcdefg'[::2]
'aceg'
二闯睹、迭代
如果給定一個list或tuple戏羽,我們可以通過for循環(huán)來遍歷這個list或tuple,這種便利我們稱為迭代(Iteration)楼吃。
在Python中始花,迭代是通過for ... in
來完成的,而很多語言比如C語言孩锡,迭代list是通過下表完成的酷宵,比如Java代碼:
for(i=0; i<list.length; i++){
n = list[i];
}
可以看出,Python的for
循環(huán)抽象程度要高于Java的for
循環(huán)躬窜,因為Python的for
循環(huán)不僅可以用在list或tuple上浇垦,還可以作用在其他可第二代對象上。
list這種數(shù)據(jù)類型雖然有下標(biāo)荣挨,但很多其他數(shù)據(jù)類型是沒有下標(biāo)的男韧,但是,只要是可迭代對象默垄,無論有無下標(biāo)此虑,都可以迭代,比如dict就可以:
>>> d = {'a' : 1, 'b' : 2, 'c' : 3}
>>> for key in d:
. . . print(key)
. . .
a
c
b
因為dict的存儲不是按照list的方式順序排列厕倍,所以寡壮,迭代出的結(jié)果順序很可能不一樣。
默認(rèn)情況下讹弯, dict迭代的是key况既。如果要迭代value,可以用for value in d.values()
组民,涂過要同時迭代key和value棒仍,可以用for k, v in d.items()
。
由于字符串也是可迭代對象臭胜,因此也可以作用于for循環(huán):
>>> for ch in 'abc':
. . . print(ch)
. . .
a
b
c
所以當(dāng)我們使用for
循環(huán)時莫其,只要作用于一個可迭代對象,for
循環(huán)就可以正常運行耸三, 而我們不太關(guān)心該對象是list還是其他數(shù)據(jù)類型乱陡。
如何判斷一個對象是可迭代對象呢?通過collections模塊中的Iterable類型判斷:
>>> from collections import Iterable
>>> isinstance('abc', Iterable)
True
>>> isinstance([1, 2, 3], Iterable)
True
>>> isinstance(123, Iterable)
False
最后一個小問題仪壮,如果要對list實現(xiàn)Java那樣的下標(biāo)循環(huán)怎么辦憨颠?Python中內(nèi)置的enumerate
函數(shù)可以把一個list變成 索引-元素對,這樣就可以在循環(huán)中同時迭代索引和元素本身:
>>> for i, value in enumerate(['a', 'b', 'c']):
. . . print(i, value)
. . .
0 a
1 b
2 c
三积锅、列表生成式
列表生成式即List Comprehensions爽彤,是Python內(nèi)置的非常簡單卻強大的可以用來創(chuàng)建list的生成式。
比如缚陷,要生成list[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
可以用list(range(1, 11))
:
>>> list(range(1, 11))
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
但是如果要生成[11, 22, 33, 44, ... , 10*10]呢适篙?方法一是循環(huán):
>>> L = []
>>> for x in range(1, 11):
. . . L.append(x * x)
. . .
>>> L
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
但是太繁瑣了,而列表生成式則可以用一行語句代替循環(huán)生成上面的list:
>>> [x * x for x in range(1, 11)]
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
寫列表生成式時箫爷,把要生成的元素放在前米娜嚷节,后面跟上for
循環(huán), 就可以把list創(chuàng)建出來虎锚。
還可以使用兩層循環(huán)硫痰,可以生成全排列:
>>> [m + n for m in 'ABC' for n in 'abc']
['Aa', 'Ab', 'Ac', 'Ba', 'Bb', 'Bc', 'Ca', 'Cb', 'Cc']
但是三層和三層以上的循環(huán)就很少用到了。