新聞中心
Python3 數(shù)據(jù)結(jié)構(gòu)
本章節(jié)我們主要結(jié)合前面所學的知識點來介紹Python數(shù)據(jù)結(jié)構(gòu)。

創(chuàng)新互聯(lián)公司專注于酒泉企業(yè)網(wǎng)站建設(shè),響應式網(wǎng)站設(shè)計,商城建設(shè)。酒泉網(wǎng)站建設(shè)公司,為酒泉等地區(qū)提供建站服務(wù)。全流程按需網(wǎng)站制作,專業(yè)設(shè)計,全程項目跟蹤,創(chuàng)新互聯(lián)公司專業(yè)和態(tài)度為您提供的服務(wù)
列表
Python中列表是可變的,這是它區(qū)別于字符串和元組的最重要的特點,一句話概括即:列表可以修改,而字符串和元組不能。
以下是 Python 中列表的方法:
| 方法 | 描述 |
|---|---|
| list.append(x) | 把一個元素添加到列表的結(jié)尾,相當于 a[len(a):] = [x]。 |
| list.extend(L) | 通過添加指定列表的所有元素來擴充列表,相當于 a[len(a):] = L。 |
| list.insert(i, x) | 在指定位置插入一個元素。第一個參數(shù)是準備插入到其前面的那個元素的索引,例如 a.insert(0, x) 會插入到整個列表之前,而 a.insert(len(a), x) 相當于 a.append(x) 。 |
| list.remove(x) | 刪除列表中值為 x 的第一個元素。如果沒有這樣的元素,就會返回一個錯誤。 |
| list.pop([i]) | 從列表的指定位置移除元素,并將其返回。如果沒有指定索引,a.pop()返回最后一個元素。元素隨即從列表中被移除。(方法中 i 兩邊的方括號表示這個參數(shù)是可選的,而不是要求你輸入一對方括號,你會經(jīng)常在 Python 庫參考手冊中遇到這樣的標記。) |
| list.clear() | 移除列表中的所有項,等于del a[:]。 |
| list.index(x) | 返回列表中第一個值為 x 的元素的索引。如果沒有匹配的元素就會返回一個錯誤。 |
| list.count(x) | 返回 x 在列表中出現(xiàn)的次數(shù)。 |
| list.sort() | 對列表中的元素進行排序。 |
| list.reverse() | 倒排列表中的元素。 |
| list.copy() | 返回列表的淺復制,等于a[:]。 |
下面示例演示了列表的大部分方法:
實例
>>> a
=
[
66.25
,
333
,
333
,
1
,
1234.5
]
>>>
print
(a.
count
(
333
)
, a.
count
(
66.25
)
, a.
count
(
'x'
)
)
2
1
0
>>> a.
insert
(
2
, -
1
)
>>> a.
append
(
333
)
>>> a
[
66.25
,
333
, -
1
,
333
,
1
,
1234.5
,
333
]
>>> a.
index
(
333
)
1
>>> a.
remove
(
333
)
>>> a
[
66.25
, -
1
,
333
,
1
,
1234.5
,
333
]
>>> a.
reverse
(
)
>>> a
[
333
,
1234.5
,
1
,
333
, -
1
,
66.25
]
>>> a.
sort
(
)
>>> a
[-
1
,
1
,
66.25
,
333
,
333
,
1234.5
]
注意:類似 insert, remove 或 sort 等修改列表的方法沒有返回值。
將列表當做堆棧使用
列表方法使得列表可以很方便的作為一個堆棧來使用,堆棧作為特定的數(shù)據(jù)結(jié)構(gòu),最先進入的元素最后一個被釋放(后進先出)。用 append() 方法可以把一個元素添加到堆棧頂。用不指定索引的 pop() 方法可以把一個元素從堆棧頂釋放出來。例如:
實例
>>> stack
=
[
3
,
4
,
5
]
>>> stack.
append
(
6
)
>>> stack.
append
(
7
)
>>> stack
[
3
,
4
,
5
,
6
,
7
]
>>> stack.
pop
(
)
7
>>> stack
[
3
,
4
,
5
,
6
]
>>> stack.
pop
(
)
6
>>> stack.
pop
(
)
5
>>> stack
[
3
,
4
]
將列表當作隊列使用
也可以把列表當做隊列用,只是在隊列里第一加入的元素,第一個取出來;但是拿列表用作這樣的目的效率不高。在列表的最后添加或者彈出元素速度快,然而在列表里插入或者從頭部彈出速度卻不快(因為所有其他的元素都得一個一個地移動)。
實例
>>>
from
collections
import deque
>>> queue
= deque
(
[
"Eric"
,
"John"
,
"Michael"
]
)
>>> queue.
append
(
"Terry"
)
# Terry arrives
>>> queue.
append
(
"Graham"
)
# Graham arrives
>>> queue.
popleft
(
)
# The first to arrive now leaves
'Eric'
>>> queue.
popleft
(
)
# The second to arrive now leaves
'John'
>>> queue
# Remaining queue in order of arrival
deque
(
[
'Michael'
,
'Terry'
,
'Graham'
]
)
列表推導式
列表推導式提供了從序列創(chuàng)建列表的簡單途徑。通常應用程序?qū)⒁恍┎僮鲬糜谀硞€序列的每個元素,用其獲得的結(jié)果作為生成新列表的元素,或者根據(jù)確定的判定條件創(chuàng)建子序列。
每個列表推導式都在 for 之后跟一個表達式,然后有零到多個 for 或 if 子句。返回結(jié)果是一個根據(jù)表達從其后的 for 和 if 上下文環(huán)境中生成出來的列表。如果希望表達式推導出一個元組,就必須使用括號。
這里我們將列表中每個數(shù)值乘三,獲得一個新的列表:
>>> vec
=
[
2
,
4
,
6
]
>>>
[
3*x
for x
in vec
]
[
6
,
12
,
18
]
現(xiàn)在我們玩一點小花樣:
>>>
[
[x
, x**
2
]
for x
in vec
]
[
[
2
,
4
]
,
[
4
,
16
]
,
[
6
,
36
]
]
這里我們對序列里每一個元素逐個調(diào)用某方法:
實例
>>> freshfruit
=
[
' banana'
,
' loganberry '
,
'passion fruit '
]
>>>
[weapon.
strip
(
)
for weapon
in freshfruit
]
[
'banana'
,
'loganberry'
,
'passion fruit'
]
我們可以用 if 子句作為過濾器:
>>>
[
3*x
for x
in vec
if x
>
3
]
[
12
,
18
]
>>>
[
3*x
for x
in vec
if x
<
2
]
[
]
以下是一些關(guān)于循環(huán)和其它技巧的演示:
>>> vec1
=
[
2
,
4
,
6
]
>>> vec2
=
[
4
,
3
, -
9
]
>>>
[x*y
for x
in vec1
for y
in vec2
]
[
8
,
6
, -
18
,
16
,
12
, -
36
,
24
,
18
, -
54
]
>>>
[x+y
for x
in vec1
for y
in vec2
]
[
6
,
5
, -
7
,
8
,
7
, -
5
,
10
,
9
, -
3
]
>>>
[vec1
[i
]*vec2
[i
]
for i
in
range
(
len
(vec1
)
)
]
[
8
,
12
, -
54
]
列表推導式可以使用復雜表達式或嵌套函數(shù):
>>>
[
str
(
round
(
355/
113
, i
)
)
for i
in
range
(
1
,
6
)
]
[
'3.1'
,
'3.14'
,
'3.142'
,
'3.1416'
,
'3.14159'
]
嵌套列表解析
Python的列表還可以嵌套。
以下實例展示了3X4的矩陣列表:
>>> matrix
=
[
...
[
1
,
2
,
3
,
4
]
,
...
[
5
,
6
,
7
,
8
]
,
...
[
9
,
10
,
11
,
12
]
,
...
]
以下實例將3X4的矩陣列表轉(zhuǎn)換為4X3列表:
>>>
[
[row
[i
]
for row
in matrix
]
for i
in
range
(
4
)
]
[
[
1
,
5
,
9
]
,
[
2
,
6
,
10
]
,
[
3
,
7
,
11
]
,
[
4
,
8
,
12
]
]
以上實例也可以使用以下方法來實現(xiàn):
>>> transposed
=
[
]
>>>
for i
in
range
(
4
):
...
transposed.
append
(
[row
[i
]
for row
in matrix
]
)
...
>>> transposed
[
[
1
,
5
,
9
]
,
[
2
,
6
,
10
]
,
[
3
,
7
,
11
]
,
[
4
,
8
,
12
]
]
另外一種實現(xiàn)方法:
>>> transposed
=
[
]
>>>
for i
in
range
(
4
):
...
# the following 3 lines implement the nested listcomp
...
transposed_row
=
[
]
...
for row
in matrix:
...
transposed_row.
append
(row
[i
]
)
...
transposed.
append
(transposed_row
)
...
>>> transposed
[
[
1
,
5
,
9
]
,
[
2
,
6
,
10
]
,
[
3
,
7
,
11
]
,
[
4
,
8
,
12
]
]
del 語句
使用 del 語句可以從一個列表中根據(jù)索引來刪除一個元素,而不是值來刪除元素。這與使用 pop() 返回一個值不同??梢杂?del 語句從列表中刪除一個切割,或清空整個列表(我們以前介紹的方法是給該切割賦一個空列表)。例如:
>>> a
=
[-
1
,
1
,
66.25
,
333
,
333
,
1234.5
]
>>>
del a
[
0
]
>>> a
[
1
,
66.25
,
333
,
333
,
1234.5
]
>>>
del a
[
2:
4
]
>>> a
[
1
,
66.25
,
1234.5
]
>>>
del a
[:
]
>>> a
[
]
也可以用 del 刪除實體變量:
>>> del a
元組和序列
元組由若干逗號分隔的值組成,例如:
>>> t
=
12345
,
54321
,
'hello!'
>>> t
[
0
]
12345
>>> t
(
12345
,
54321
,
'hello!'
)
>>>
# Tuples may be nested:
...
u
= t
,
(
1
,
2
,
3
,
4
,
5
)
>>> u
(
(
12345
,
54321
,
'hello!'
)
,
(
1
,
2
,
3
,
4
,
5
)
)
如你所見,元組在輸出時總是有括號的,以便于正確表達嵌套結(jié)構(gòu)。在輸入時可能有或沒有括號, 不過括號通常是必須的(如果元組是更大的表達式的一部分)。
集合
集合是一個無序不重復元素的集?;竟δ馨P(guān)系測試和消除重復元素。
可以用大括號({})創(chuàng)建集合。注意:如果要創(chuàng)建一個空集合,你必須用 set() 而不是 {} ;后者創(chuàng)建一個空的字典,下一節(jié)我們會介紹這個數(shù)據(jù)結(jié)構(gòu)。
以下是一個簡單的演示:
>>> basket
=
{
'apple'
,
'orange'
,
'apple'
,
'pear'
,
'orange'
,
'banana'
}
>>>
print
(basket
)
# 刪除重復的
{
'orange'
,
'banana'
,
'pear'
,
'apple'
}
>>>
'orange'
in basket
# 檢測成員
True
>>>
'crabgrass'
in basket
False
>>>
# 以下演示了兩個集合的操作
...
>>> a
=
set
(
'abracadabra'
)
>>> b
=
set
(
'alacazam'
)
>>> a
# a 中唯一的字母
{
'a'
,
'r'
,
'b'
,
'c'
,
'd'
}
>>> a - b
# 在 a 中的字母,但不在 b 中
{
'r'
,
'd'
,
'b'
}
>>> a | b
# 在 a 或 b 中的字母
{
'a'
,
'c'
,
'r'
,
'd'
,
'b'
,
'm'
,
'z'
,
'l'
}
>>> a & b
# 在 a 和 b 中都有的字母
{
'a'
,
'c'
}
>>> a ^ b
# 在 a 或 b 中的字母,但不同時在 a 和 b 中
{
'r'
,
'd'
,
'b'
,
'm'
,
'z'
,
'l'
}
集合也支持推導式:
>>> a
=
{x
for x
in
'abracadabra'
if x
not
in
'abc'
}
>>> a
{
'r'
,
'd'
}
字典
另一個非常有用的 Python 內(nèi)建數(shù)據(jù)類型是字典。
序列是以連續(xù)的整數(shù)為索引,與此不同的是,字典以關(guān)鍵字為索引,關(guān)鍵字可以是任意不可變類型,通常用字符串或數(shù)值。
理解字典的最佳方式是把它看做無序的鍵=>值對集合。在同一個字典之內(nèi),關(guān)鍵字必須是互不相同。
一對大括號創(chuàng)建一個空的字典:{}。
這是一個字典運用的簡單例子:
>>> tel
=
{
'jack':
4098
,
'sape':
4139
}
>>> tel
[
'guido'
]
=
4127
>>> tel
{
'sape':
4139
,
'guido':
4127
,
'jack':
4098
}
>>> tel
[
'jack'
]
4098
>>>
del tel
[
'sape'
]
>>> tel
[
'irv'
]
=
4127
>>> tel
{
'guido':
4127
,
'irv':
4127
,
'jack':
4098
}
>>>
list
(tel.
keys
(
)
)
[
'irv'
,
'guido'
,
'jack'
]
>>>
sorted
(tel.
keys
(
)
)
[
'guido'
,
'irv'
,
'jack'
]
>>>
'guido'
in tel
True
>>>
'jack'
not
in tel
False
構(gòu)造函數(shù) dict() 直接從鍵值對元組列表中構(gòu)建字典。如果有固定的模式,列表推導式指定特定的鍵值對:
>>>
dict
(
[
(
'sape'
,
4139
)
,
(
'guido'
,
4127
)
,
(
'jack'
,
4098
)
]
)
{
'sape':
4139
,
'jack':
4098
,
'guido':
4127
}
此外,字典推導可以用來創(chuàng)建任意鍵和值的表達式詞典:
>>>
{x: x**
2
for x
in
(
2
,
4
,
6
)
}
{
2:
4
,
4:
16
,
6:
36
}
如果關(guān)鍵字只是簡單的字符串,使用關(guān)鍵字參數(shù)指定鍵值對有時候更方便:
>>>
dict
(sape
=
4139
, guido
=
4127
, jack
=
4098
)
{
'sape':
4139
,
'jack':
4098
,
'guido':
4127
}
遍歷技巧
在字典中遍歷時,關(guān)鍵字和對應的值可以使用 items() 方法同時解讀出來:
>>> knights
=
{
'gallahad':
'the pure'
,
'robin':
'the brave'
}
>>>
for k
, v
in knights.
items
(
):
...
print
(k
, v
)
...
gallahad the pure
robin the brave
在序列中遍歷時,索引位置和對應值可以使用 enumerate() 函數(shù)同時得到:
>>>
for i
, v
in
enumerate
(
[
'tic'
,
'tac'
,
'toe'
]
):
...
print
(i
, v
)
...
0 tic
1 tac
2 toe
同時遍歷兩個或更多的序列,可以使用 zip() 組合:
>>> questions
=
[
'name'
,
'quest'
,
'favorite color'
]
>>> answers
=
[
'lancelot'
,
'the holy grail'
,
'blue'
]
>>>
for q
, a
in
zip
(questions
, answers
):
...
print
(
'What is your {0}? It is {1}.'.
format
(q
, a
)
)
...
What
is your name? It
is lancelot.
What
is your quest? It
is the holy grail.
What
is your favorite color? It
is blue.
要反向遍歷一個序列,首先指定這個序列,然后調(diào)用 reversed() 函數(shù):
>>>
for i
in
reversed
(
range
(
1
,
10
,
2
)
):
...
print
(i
)
...
9
7
5
3
1
要按順序遍歷一個序列,使用 sorted() 函數(shù)返回一個已排序的序列,并不修改原值:
>>> basket
=
[
'apple'
,
'orange'
,
'apple'
,
'pear'
,
'orange'
,
'banana'
]
>>>
for f
in
sorted
(
set
(basket
)
):
...
print
(
網(wǎng)頁題目:Python3數(shù)據(jù)結(jié)構(gòu)
標題URL:http://www.dlmjj.cn/article/cdjjjdi.html


咨詢
建站咨詢
