列表

列表

定義:

列表使用方括號括起來[],每個元素以逗號分割;

可以儲存不同的數據類型

特點:

  • 是一個有序的
  • 可以重複的
  • 可變類型

創建:

  • 創建空列表
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]]

# 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章