1.1.列表定義
列表是python中內(nèi)置有序可變序列,列表的所有元素放在一對中括號“[]”中寻仗,并使用逗號分隔開衙耕;
一個(gè)列表中的數(shù)據(jù)類型可以各不相同昧穿,可以同時(shí)分別為整數(shù)、實(shí)數(shù)橙喘、字符串等基本類型粤咪,甚至是列表、字典以及其他自定義類型的對象渴杆。
例如:
[1, 2, 3, 2.4, 5]
[0.01, "zhangsan", [1,2,3]]
創(chuàng)建
- 使用“=”直接將一個(gè)列表賦值給變量即可創(chuàng)建列表對象寥枝。例如:a_list = [], b_list = [1, 2, 3]
- 使用list()函數(shù)將元組、range對象磁奖、字符串或其他類型的可迭代對象類型的數(shù)據(jù)轉(zhuǎn)換為列表囊拜。
例如:a_list = list("Hello")將字符串"hello"轉(zhuǎn)換成列表['H', 'e', 'l', 'l', 'o']
刪除 當(dāng)不再使用時(shí),使用del命令刪除整個(gè)列表 例如:
>>>x = [1, 2, 3]
>>>del x[1] #刪除指定位置元素
>>>x
[1, 3]
>>>del x #刪除整個(gè)列表
>>>x
Traceback (most recent call last):
File "<pyshell#6>", line 1, in <module>
x
NameError: name 'x' is not defined
1.2.列表元素的增加
1.2.1.append()
向列表尾部追加一個(gè)元素比搭,不改變其內(nèi)存首地址冠跷,屬于原地操作。例如:
x = [1, 2, 3]
x.append(4)
print(x)
輸出:
[1, 2, 3, 4]
1.2.2.insert()
向列表任意位置插入一個(gè)元素,不改變其內(nèi)存首地址蜜托,屬于原地操作抄囚。
例如:
x = [1,3,4]
x.insert(1,2)
print(x)
輸出:
[1, 2, 3, 4]
1.2.3.extend()
將另一個(gè)迭代對象的所有元素添加至該列表對象尾部,不改變其內(nèi)存地址橄务,屬于原地操作幔托。
例如:
x = [1,2]
x.extend([3,4])
print(x)
輸出:
[1, 2, 3, 4]
1.3.運(yùn)算符"+"和"*"
并不是真的為列表添加元素,而是創(chuàng)建一個(gè)新列表蜂挪,不屬于原地操作重挑,而是返回新列表。
x = [1,2,3]
y = x + [4]
print(y)
y = x*2
print(y)
輸出:
[1, 2, 3, 4]
[1, 2, 3, 1, 2, 3]
此時(shí)x保持不變棠涮,依舊是[1,2,3]
1.4.列表元素的刪除
1.4.1.pop()
使用列表的pop()方法刪除并返回指定(默認(rèn)為最后一個(gè))位置上的元素谬哀,如果給定的索引超出了列表的范圍,則拋出異常严肪。
x = [1,2,3,4]
print(x.pop())
print(x.pop(1))
輸出:
4
2
1.4.2.remove()
刪除首次出現(xiàn)的指定元素史煎,如果列表中不錯(cuò)在要?jiǎng)h除的元素,則拋出異常驳糯。
例如:
x = [1,2,3,4]
x.remove(2)
print(x)
輸出:
[1, 3, 4]
1.4.3.del
刪除列表中的指定位置上的元素劲室。
例如:
x = [1,2,3,4]
del x[1]
print(x)
輸出:
[1, 3, 4]
1.5.列表元素訪問與計(jì)數(shù)
1.5.1.count()
統(tǒng)計(jì)指定元素在列表對象中出現(xiàn)的次數(shù)。
例如:
x = [1,2,3,3,4,5]
print(x.count(3))
print(x.count(0))
輸出:
2
0
1.5.2.index()
獲取指定元素首次出現(xiàn)的下標(biāo)结窘,若列表對象中不存在指定元素,則拋出異常充蓝。
例如:
x = [1,2,3,2,2,4]
print(x.index(2))
輸出:
1
1.5.3.in
測試列表中是否存在某元素
例如:
x = [1,2,3,4]
print(3 in x)
print(5 in x)
輸出:
True
False
1.6.列表排序
1.6.1.sort()
按照指定規(guī)則對所有元素進(jìn)行排序隧枫,默認(rèn)規(guī)則是直接比較規(guī)則大小。
例如:
aList = [3,4,5,6,7,9,11,13,15,17]
import random
random.shuffle(aList) #隨機(jī)降序
print(aList)
aList.sort() #默認(rèn)是升序排序
aList.sort(reverse = True) #降序排序
print(aList)
輸出:
[15, 4, 13, 11, 5, 17, 9, 3, 7, 6]
[17, 15, 13, 11, 9, 7, 6, 5, 4, 3]
1.6.2.reverse()
將列表中所有元素原地逆序排列谓苟。
例如:
x = [6,4,2,4,1]
print(sorted(x))
print(sorted(x,reverse = True))
print(x)
輸出:
[1, 2, 4, 4, 6]
[6, 4, 4, 2, 1]
[6, 4, 2, 4, 1]
1.6.4.reversed()
返回一個(gè)逆序排列后的迭代對象官脓,不對原列表做任何修改。
例如:
x = [1,5,3,6,2]
print(list(reversed(x)))
print(x)
輸出:
[2, 6, 3, 5, 1]
[1, 5, 3, 6, 2]
1.7.用語序列操作的常用內(nèi)置函數(shù)
1.7.1.len()
返回列表中的元素個(gè)數(shù)涝焙,同樣適用于元組卑笨、字典、集合仑撞、字符串等赤兴。
1.7.2.max()、min()
返回列表中的最大或最小元素隧哮,同樣適用于元組桶良、集合、range對象等沮翔。
1.7.3.sum()
對列表的元素進(jìn)行求和運(yùn)算陨帆。
1.7.4.zip()
返回可迭代的zip對象。
例如:
aList = [1, 2, 3]
bList = [4, 5, 6]
cList = zip(aList, bList)
print(cList)
print(list(cList))
輸出:
<zip object at 0x0000020CBC537D08>
[(1, 4), (2, 5), (3, 6)]
1.7.5.enumerate()
枚舉列表元素,返回枚舉對象疲牵,其中每個(gè)元素為包含下標(biāo)和值的元組承二。該函數(shù)對元組、字符串同樣有效纲爸。
例如:
for item in enumerate('abcdef'):
print(item)
輸出:
(0, 'a')
(1, 'b')
(2, 'c')
(3, 'd')
(4, 'e')
(5, 'f')
1.8.遍歷列表的三種方式
a = ['a','b','c','d','e','f']
for i in a:
print(i)
for i in range(len(a)):
print(i,a[i])
for i,ele in enumerate(a):
print(i,ele)
輸出:
a
b
c
d
e
f
0 a
1 b
2 c
3 d
4 e
5 f
0 a
1 b
2 c
3 d
4 e
5 f
1.9.列表推導(dǎo)式
列表推導(dǎo)式使用非常簡潔的方式來快速生成滿足特定需求的列表亥鸠,代碼具有非常強(qiáng)的可讀性。
語法形式:[表達(dá)式 for 變量 in 序列或迭代對象]
列表推導(dǎo)式在邏輯上相當(dāng)于一個(gè)循環(huán)缩焦,知識(shí)形式更加簡潔读虏。
lis = [i for i in range(100)]
print(lis)
使用列表推導(dǎo)式實(shí)現(xiàn)嵌套列表的平鋪
ves = [[1,2,3],[4,5,6],[7,8,9]]
print([num for elem in ves for num in elem])
輸出:
[1, 2, 3, 4, 5, 6, 7, 8, 9]
過濾不符合條件的元素,從列表中選擇符合條件的元素組成新的列表
aList = [-1,-4,6,7.5,-2.3,9,-11]
print([i for i in aList if i>0])
[6, 7.5, 9]
在列表推導(dǎo)式中使用多個(gè)循環(huán)袁滥,實(shí)現(xiàn)多序列元素的任意組合盖桥,并且可以結(jié)合條件語句過濾特定元素
print([(x,y) for x in range(3) for y in range(3)])
[(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)]
print([(x,y) for x in [1,2,3] for y in [3,1,4] if x != y])
[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]
列表練習(xí)
寫一個(gè)循環(huán),不斷地問用戶想買什么题翻,用戶選擇一個(gè)商品編號揩徊,就把相應(yīng)的商品添加到購物車?yán)铮罱K用戶輸入q退出時(shí)嵌赠,打印購物車?yán)锏纳唐妨斜?/p>
products = [['iphone',6888],['三星',30000],['小米',2500]]
shopping_car = []
flag = True
while flag:
print("******商品列表******")
for index,i in enumerate(products):
print("%s, %s| %s" %(index,i[0],i[1]))
choice = input("請輸出您想購買的商品的編號:")
if choice.isdigit():#isdigit()判斷變量是什么類型
choice = int(choice)
if choice >= 0 and choice < len(products):
shopping_car.append(products[choice])
print("已經(jīng)將%s加入購物車" % (products[choice]))
else:
print("該商品不存在")
elif choice == "q":
if len(shopping_car)>0:
print("您打算購買以下商品:")
for index,i in enumerate(shopping_car):
print("%s. %s| %s" %(index,i[0],i[1]))
else:
print("您的購物車中沒有添加商品")
flag = False
輸出:
******商品列表******
0, iphone| 6888
1, 三星| 30000
2, 小米| 2500
請輸出您想購買的商品的編號:0
已經(jīng)將['iphone', 6888]加入購物車
******商品列表******
0, iphone| 6888
1, 三星| 30000
2, 小米| 2500
請輸出您想購買的商品的編號:1
已經(jīng)將['三星', 30000]加入購物車
******商品列表******
0, iphone| 6888
1, 三星| 30000
2, 小米| 2500
請輸出您想購買的商品的編號:2
已經(jīng)將['小米', 2500]加入購物車
******商品列表******
0, iphone| 6888
1, 三星| 30000
2, 小米| 2500
請輸出您想購買的商品的編號:q
您打算購買以下商品:
0. iphone| 6888
1. 三星| 30000
2. 小米| 2500
1.10.列表切片
使用索引獲取列表的元素(隨機(jī)讀人芑摹)
列表元素支持用索引訪問,正向所以從0開始
colors = ["red","blue","green"]
print(colors[0])
print(colors[1])
print(colors[2])
print(colors[-1])
red
blue
green
green
1.10.1.列表的切片操作
切片操作不是列表特有的姜挺,python中的有序序列都支持切片齿税,如字符串,元組炊豪。
切片的返回結(jié)果類型和切片對象類型一致凌箕,返回的是切片對象的子序列,如:對一個(gè)列表切片返回一個(gè)列表词渤,字符串切片返回字符串牵舱。
格式:li[start:end:step]
start是切片起點(diǎn)索引,end是切片終點(diǎn)索引缺虐,但切片結(jié)果不包括終點(diǎn)索引的值芜壁。step是步長默認(rèn)是1。
li=["A","B","C","D"]
t=li[0:3] #起點(diǎn)的0索引可以省略
print(t)
t=li[2:] #省略end高氮,則切到末尾
print(t)
t=li[1:3]
print(t)
t=li[0:4:2] #從li[0]到li[3]慧妄,設(shè)定步長為2.
print(t)
如何確定start和end,是什么關(guān)系剪芍?在step的符號一定的情況下腰涧,start和end可以混合使用正向和反向索引,無論怎樣紊浩,你都要保證start和end之間有和step反向一致元素間隔窖铡,否則會(huì)切出空列表疗锐。
t=li[0:2]
t=li[0,-2]
t=li[-4,-2]
t=li[-4,2]
上面的結(jié)果都是一樣的:t為["A","B"]
t=li[-1:-3:-1]
t=li[-1:1:-1]
t=li[3:1:-1]
t=li[3:-3:-1]
上面的結(jié)果都是一樣的:t為["D","C"]
t=li[-1:-3]
t=li[-1:1]
t=li[3:1]
t=li[3:-3]
都切出空列表
同時(shí),step的正負(fù)決定了切片結(jié)果的元素采集的先后
省略start和end表示以原列表全部為目標(biāo)
t=li[::-1] t--->["C","B","A"] #反向切费彼,切出全部
t=li[:] t--->["A","B","C","D"] #正向切全部
1.10.2.使用切片來原地修改列表內(nèi)容
aList = [3,5,7]
aList[len(aList):] = [9] #在尾部追加元素
print(aList)
aList[:3] = [1,2,3] #替換前3個(gè)元素
print(aList)
aList[:3] = [] #刪除前3個(gè)元素
print(aList)
[3, 5, 7, 9]
[1, 2, 3, 9]
[9]
1.10.3.使用del與切片結(jié)合來刪除列表元素
aList = [3,5,7,9,11]
del aList[:3] #刪除前3個(gè)元素
print(aList)
bList = [3,5,7,9,11]
del bList[::2] #刪除偶數(shù)位置上的元素
print(bList)
[9, 11]
[5, 9]
1.10.4.切片返回的是列表元素的淺復(fù)制
所謂淺復(fù)制滑臊,是指生成一個(gè)新的列表,并且把原列表中所有元素的引用都復(fù)制到新列表中箍铲。
例如:
aList = [3,5,7]
bList = aList #bList與aList指向同一個(gè)內(nèi)容
print(bList)
bList[1] = 8 #修改其中一個(gè)對象會(huì)影響另一個(gè)
print(aList)
print(aList == bList) #判斷兩個(gè)列表的元素是否完全一致
print(aList is bList) #判斷兩個(gè)列表是同一個(gè)對象
print(id(aList)) #內(nèi)存地址
aList = [3,5,7]
bList = aList[::] #切片雇卷,淺復(fù)制
print(aList == bList) #兩個(gè)列表的元素完全一致
print(aList is bList) #兩個(gè)列表不是同一個(gè)對象
print(id(aList) == id(bList)) #內(nèi)存地址不一致
bList[1] = 8
print(bList)
print(aList)
[3, 5, 7]
[3, 8, 7]
True
True
2340905449608
True
False
False
[3, 8, 7]
[3, 5, 7]
1.11.元組
元組屬于不可變序列,一旦常見颠猴,用任何方法都不可以修改其元素关划。從形式上,元組的所有元素放在一對圓括號中翘瓮,元素之間用逗號分隔贮折。
1.11.1.元組的創(chuàng)建與刪除
創(chuàng)建 使用“=”將一個(gè)元組賦值給變量
例如:
x = (1,2,3) #直接把元組賦值給一個(gè)變量
print(x)
創(chuàng)建只有一個(gè)元素的元組
x = (3)
print(type(x))
x = (3,)
print(type(x))
<class 'int'>
<class 'tuple'>
創(chuàng)建空元組的方法
x = ()
print(x)
x = tuple()
print(x)
()
()
使用tuple函數(shù)將其他序列轉(zhuǎn)換為元組
print(tuple(range(5)))
print(tuple('abcdefg')) #把字符串轉(zhuǎn)換為元組
aList = [-1,-4,6,7.5,-2.3,9,-11]
print(tuple(aList)) #把列表轉(zhuǎn)換為元組
(0, 1, 2, 3, 4)
('a', 'b', 'c', 'd', 'e', 'f', 'g')
(-1, -4, 6, 7.5, -2.3, 9, -11)
刪除 使用del可以刪除元組對象,不能刪除元組中的元素
1.11.2.元組與列表的區(qū)別
- 元組中的數(shù)據(jù)一旦定義就不允許更改资盅。
- 元組沒有append()调榄、expend()和insert()等方法,無法向元組中添加元素
- 元組沒有remove()或pop()方法呵扛,也無法對元組元素進(jìn)行del操作每庆,不能從元組中刪除元素。
- 從效果上看今穿,tuple()凍結(jié)列表缤灵,而list()融化元組。
1.12.元組的優(yōu)點(diǎn)
- 元組的速度比列表更快
- 元組對不需要改變的數(shù)據(jù)進(jìn)行“寫保護(hù)”將使得代碼更加安全蓝晒。
- 元組可用作字典鍵(特別是包含字符串腮出、數(shù)值和其他元組這樣的不可變數(shù)據(jù)的元組)。元組有時(shí)還作為函數(shù)的返回值返回(返回多個(gè)值)拔创。