python_列表和元組

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è)值)拔创。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市富蓄,隨后出現(xiàn)的幾起案子剩燥,更是在濱河造成了極大的恐慌,老刑警劉巖立倍,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件灭红,死亡現(xiàn)場離奇詭異,居然都是意外死亡口注,警方通過查閱死者的電腦和手機(jī)变擒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來寝志,“玉大人娇斑,你說我怎么就攤上這事策添。” “怎么了毫缆?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵唯竹,是天一觀的道長。 經(jīng)常有香客問我苦丁,道長浸颓,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任旺拉,我火速辦了婚禮产上,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蛾狗。我一直安慰自己晋涣,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布淘太。 她就那樣靜靜地躺著姻僧,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蒲牧。 梳的紋絲不亂的頭發(fā)上撇贺,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天,我揣著相機(jī)與錄音冰抢,去河邊找鬼松嘶。 笑死,一個(gè)胖子當(dāng)著我的面吹牛挎扰,可吹牛的內(nèi)容都是我干的翠订。 我是一名探鬼主播,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼遵倦,長吁一口氣:“原來是場噩夢啊……” “哼尽超!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起梧躺,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤似谁,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后掠哥,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體巩踏,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年续搀,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了塞琼。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,981評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡禁舷,死狀恐怖彪杉,靈堂內(nèi)的尸體忽然破棺而出毅往,到底是詐尸還是另有隱情,我是刑警寧澤在讶,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布煞抬,位于F島的核電站,受9級特大地震影響构哺,放射性物質(zhì)發(fā)生泄漏革答。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一曙强、第九天 我趴在偏房一處隱蔽的房頂上張望残拐。 院中可真熱鬧,春花似錦碟嘴、人聲如沸溪食。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽错沃。三九已至,卻和暖如春雀瓢,著一層夾襖步出監(jiān)牢的瞬間枢析,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工刃麸, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留醒叁,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓泊业,卻偏偏與公主長得像把沼,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子吁伺,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,933評論 2 355

推薦閱讀更多精彩內(nèi)容