文章目錄
列表
定義:
列表使用方括號括起來[],每個元素以逗號分割;
可以儲存不同的數據類型
特點:
- 是一個有序的
- 可以重複的
- 可變類型
創建:
- 創建空列表
li = []
print(type(li))
<class 'list'>
- 創建多元素列表
li = [1, 2, 3, "abcd", "City", "College", ["I", "Love", "Python"]]
print(li,type(li))
[1, 2, 3, 'abcd', 'City', 'College', ['I', 'Love', 'Python']] <class 'list'>
- 強轉
sr = "abcd"
list1 = list(sr)
print((list1, type(list1)))
(['a', 'b', 'c', 'd'], <class 'list'>)
列表常用操作:
(1)拼接:
li1 = ["I"]
li2 = ["Love"]
li3 = ["Python"]
print(li1 + li2 + li3)
['I', 'Love', 'Python']
(2)重複
li1 = ["I"]
print(li1 * 3)
['I', 'I', 'I']
(3)索引(偏移)[],切片[:],[::]
li1 = [1, 2, 3, '4']
print(li1[0], li1[3])
1 4
print(len(li1))
print(li1[0], li1[-4])
print(li1[:3])
print(li1[::-1])
4
1 1
[1, 2, 3]
['4', 3, 2, 1]
li = [1, 2, 3, '4', [1, 2, 3, '4ds']]
print(li[4][3][1])
d
(4)列表的常見操作(增刪改查)
1.增
.append()# 所有元素作爲整體添加
li = ["City", "liyue"]
li1 = ["a", "b", "c", "d"]
print(id(li))
li.append(li1)
print((li, id(li)))
li = ["a", "b"]
print(id(li))
3206680913864
(['City', 'liyue', ['a', 'b', 'c', 'd']], 3206680913864)
3206681332360
sr = "城市學院"
li = []
for i in sr:
li.append(ord(i))
print(li)
[22478, 24066, 23398, 38498]
.extend()# 取出所有元素再依次添加
li = ["City", "liyue"]
li1 = ["a", "b", "c", "d"]
li.extend(li1)
print(li)
['City', 'liyue', 'a', 'b', 'c', 'd']
.insert()# 按照索引添加
li = ["City", "liyue"]
li1 = ["a", "b", "c", "d"]
li.insert(1, li1)
print(li)
['City', ['a', 'b', 'c', 'd'], 'liyue']
sr = "abc"
sr[3] = "D"
Traceback (most recent call last):
File "D:/python/test1/day03.py", line 59, in <module>
sr[3] = "D"
TypeError: 'str' object does not support item assignment
li = ["City", "liyue"]
li[6] = 666
print(li)
Traceback (most recent call last):
File "D:/python/test1/day03.py", line 62, in <module>
li[6] = 666
IndexError: list assignment index out of range
li1 = ["a", "b", "c", "d"]
li1[1:3] = ["x", "y", "z"]
print(li1)
['a', 'x', 'y', 'z', 'd']
li1 = ["a", "b", "c", "d"]
li1[1:4] = ["x", "y", "z"]
print(li1)
['a', 'x', 'y', 'z']
2.刪
.pop()# 如果不指定索引,默認刪除最後一個,返回被刪除的元素(出棧)
li = ["a", "b", "c", "d", "e"]
print(li.pop())
print(li)
print(li.pop(2))
print(li)
e
['a', 'b', 'c', 'd']
c
['a', 'b', 'd']
.remove()# 刪除第一次遇到的指定元素,無返回值
li = ["a", "b", "c", "d", "e", "e"]
print(li.remove("e"))
print(li)
None
['a', 'b', 'c', 'd', 'e']
del# python中帶的方法,可用來刪除整個列表
li = ["a", "b", "c", "d", "e"]
del li[3]
print(li)
del li
print(li)
['a', 'b', 'c', 'e']
Traceback (most recent call last):
File "D:/python/test1/day03.py", line 79, in <module>
print(li)
NameError: name 'li' is not defined# 列表已經被完全刪除
.clear()# 清空列表的所有元素,無返回值
li = ["a", "b", "c", "d", "e"]
print(li.clear())
print(li)
None
[]
3.改
利用索引直接修改
4.查
索引,切片
遍歷
(1)元素遍歷
li = ["a", "b", "c", "d", "e"]
for i in li:
print(i,end=" ")
a b c d e
(2)索引遍歷
li = ["a", "b", "c", "d", "e"]
for i in range(len(li)):
print(li[i],end='')
abcde
(3)枚舉遍歷
enumerate() # 對於一個可迭代的/可遍歷的對象(如列表、字符串等),enumerate()會將其組成一個索引序列,利用他,我們可以同時獲得索引和值
li = ["a", "b", "c", "d", "e"]
for i in enumerate(li):
print(i, end=' ')
print()
for i in enumerate(li, 2):# 第二個參數爲初始索引值
print(i, end=' ')
print()
for index, value in enumerate(li):# 用雙參數分別取出索引和值,再輸出
print(index, value, end=' ')
(0, 'a') (1, 'b') (2, 'c') (3, 'd') (4, 'e')
(2, 'a') (3, 'b') (4, 'c') (5, 'd') (6, 'e')
0 a 1 b 2 c 3 d 4 e
5.其他操作
.count()# 計數
.reverse()# 反轉
.sort(key=None, reverse=False)# 排序,若元素爲序列,則依次取出每個序列的元素依次進行比較,字符串無法與列表比較
# 參數key=,指定可迭代對象中的一個元素進行排序
li = ["a", "b", "c", "d", "e"]
li.reverse()
print(li)
li.sort()
print(li)
li.sort(reverse=True)# 參數reverse=True/False 反向/正向,默認爲False
print(li)
['e', 'd', 'c', 'b', 'a']
['a', 'b', 'c', 'd', 'e']
['e', 'd', 'c', 'b', 'a']
列表取交集
li = ["a", "b", "c", "d"]
li2 = ["c", "d", "e", "f"]
for i in li:
if i in li2:
print(i)
li3 = [i for i in li if i in li2]
print(li3)
c
d
['c', 'd']
用列表堆棧實現
class stacklist:
def __init__(self):
self.list1 = []
self.flag = -1
def stack_in(self, str):
self.list1.append(str)
self.flag += 1
def stack_out(self):
if self.flag == -1:
print("空棧")
return
self.flag -= 1
return print(self.list1.pop())
def runout(self):
print(self.list1[::-1])
a = stacklist()
a.stack_out()
a.stack_in(9)
a.stack_in("55")
a.stack_out()
a.stack_in(5)
a.runout()
空棧
55
[5, 9]
賦值與深淺拷貝
賦值
賦值是對對象的引用
la = [1, 2, 3, 4, 5, 'a', ['b1', 'b2']]
lb = la
la.pop()
print((la,lb))#兩個變量指向同一個對象,改變其中一個,另一個也會隨着改變
([1, 2, 3, 4, 5, 'a'], [1, 2, 3, 4, 5, 'a'])
深淺拷貝
淺拷貝會創建新對象,內容是原對象的引用
三種實現方法:
- 切片操作[:]
- 工廠函數 list(li)
- copy模塊內的copy函數
import copy
la = [1, 2, 3, 4, 5, 'a', ['b1', 'b2']]
lb = la
lb2 = la[:]
lb_copy = copy.copy(la)
print(id(la), id(lb_copy))
print(id(la), id(lb2))
la.append('test') # 添加原子類型,不會影響lb_copy
la[6][0] = 'bbb' #
print(la)
print(lb)
print(lb2)
print(lb_copy)
2084394830408 2084394829448
2084394830408 2084394830472
[1, 2, 3, 4, 5, 'a', ['bbb', 'b2'], 'test']
[1, 2, 3, 4, 5, 'a', ['bbb', 'b2'], 'test']
[1, 2, 3, 4, 5, 'a', ['bbb', 'b2']]
[1, 2, 3, 4, 5, 'a', ['bbb', 'b2']]
深拷貝
import copy
la = [1, 2, 3, 4, 5, 'a', ['b1', 'b2']]
lb_deepcopy = copy.deepcopy(la)
print(id(la), id(lb_deepcopy))
# 2114121894472 2114121894536
la[5] = 'aaa'
print(la)
print(lb_deepcopy)
#[1, 2, 3, 4, 5, 'aaa', ['b1', 'b2']]
#[1, 2, 3, 4, 5, 'a', ['b1', 'b2']]
la[6][1] = 'aaa'
print(la)
print(lb_deepcopy)
#[1, 2, 3, 4, 5, 'aaa', ['b1', 'aaa']]
#[1, 2, 3, 4, 5, 'a', ['b1', 'b2']]
淺拷貝相當於只拷貝了一層,修改外層元素,就會修改引用,讓他們指向另一個位置。而修改嵌套列表中的元素,列表地址沒有發生變化,指向的還是同一個位置
深拷貝拷貝對象的所有元素,包括多層嵌套的元素。因此,是開闢了一個新的內存儲區,和數據源沒有關係了。
列表解析式
li = []
for x in range(10):
li.append(x)
print(li)
print([x for x in range(10)])
print([x for x in range(10) if x % 2 == 0])
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 2, 4, 6, 8]
列表生成式
用來生成列表的特定的語法形式
sr = "城市學院"
print([ord(x) for x in sr])
[22478, 24066, 23398, 38498]
格式:
[exp for iter_val in iter]
[exp for iter_val in iter if if_condtion] # 帶過濾格式
name = ["Tom", "Jack", "Luck"]
subject = ["Python", "Java", "C", "C++"]
print([[x, y] for x in name for y in subject])
[['Tom', 'Python'], ['Tom', 'Java'], ['Tom', 'C'], ['Tom', 'C++'], ['Jack', 'Python'], ['Jack', 'Java'], ['Jack', 'C'], ['Jack', 'C++'], ['Luck', 'Python'], ['Luck', 'Java'], ['Luck', 'C'], ['Luck', 'C++']]
實現原理:
- 迭代[可迭代對象]中的每一個元素
- 每迭代一次的結果賦值給對應的迭代元素,再通過表達式運算得到一個新的值
- 最後所有通過表達式計算的值以一個列表的形式返回。
三目運算符
y = 12
x = y + 1 if y > 10 else y - 1
print(x)
13
練習
# input()函數實現往空列表中添加元素,當輸入"q"時,結束輸入,並返回列表
li = []
while True:
sr = input("請輸入元素,輸入q結束")
if sr == 'q':
print(li)
break
li.append(sr)
# 隨機生成30個0-10的隨機整數,並統計每個數出現的次數,返回的結果形式爲[[0,3],[1,4],...,[10,5]]
import random
li = []
li2 = []
for i in range(30):
li.append(random.randint(0, 10))
for i in range(11):
li2.append([i, li.count(i)])
print(li2)
[[0, 2], [1, 6], [2, 5], [3, 1], [4, 3], [5, 3], [6, 1], [7, 3], [8, 1], [9, 2], [10, 3]]
#