集合型別

Python 中有許多集合型別。雖然 intstr 等型別包含單個值,但集合型別包含多個值。

清單

list 型別可能是 Python 中最常用的集合型別。儘管它的名字,列表更像是其他語言中的陣列,主要是 JavaScript。在 Python 中,列表只是有效 Python 值的有序集合。可以通過在方括號中用逗號分隔值來建立列表:

int_list = [1, 2, 3]
string_list = ['abc', 'defghi']

列表可以為空:

empty_list = []

列表的元素不限於單個資料型別,這是合理的,因為 Python 是一種動態語言:

mixed_list = [1, 'abc', True, 2.34, None]

列表可以包含另一個列表作為其元素:

nested_list = [['a', 'b', 'c'], [1, 2, 3]]

可以通過索引或其位置的數字表示來訪問列表的元素。Python 中的列表是*零索引的,*這意味著列表中的第一個元素位於索引 0 處,第二個元素位於索引 1 處,依此類推:

names = ['Alice', 'Bob', 'Craig', 'Diana', 'Eric']
print(names[0]) # Alice
print(names[2]) # Craig

指數也可以是負數,這意味著從列表的末尾開始計數(-1 是最後一個元素的索引)。因此,使用上面示例中的列表:

print(names[-1]) # Eric
print(names[-4]) # Bob

列表是可變的,因此你可以更改列表中的值:

names[0] = 'Ann'
print(names)
# Outputs ['Ann', 'Bob', 'Craig', 'Diana', 'Eric']

此外,可以從列表中新增和/或刪除元素:

使用 L.append(object) 將物件附加到列表末尾,返回 None

names = ['Alice', 'Bob', 'Craig', 'Diana', 'Eric']
names.append("Sia")
print(names) 
# Outputs ['Alice', 'Bob', 'Craig', 'Diana', 'Eric', 'Sia']

在特定索引處新增要列出的新元素。L.insert(index, object)

names.insert(1, "Nikki")
print(names)
# Outputs ['Alice', 'Nikki', 'Bob', 'Craig', 'Diana', 'Eric', 'Sia']

使用 L.remove(value) 刪除第一次出現的值,返回 None

names.remove("Bob")
print(names) # Outputs ['Alice', 'Nikki', 'Craig', 'Diana', 'Eric', 'Sia']

獲取值為 x 的第一個專案列表中的索引。如果沒有這樣的專案,它將顯示錯誤。

name.index("Alice")
0

計算列表的長度

len(names)
6

計算列表中任何專案的出現次數

a = [1, 1, 1, 2, 3, 4]
a.count(1)
3

翻轉清單

a.reverse()
[4, 3, 2, 1, 1, 1]
# or
a[::-1]
[4, 3, 2, 1, 1, 1]

使用 L.pop([index]) 刪除並返回索引處的專案(預設為最後一項),返回該專案

names.pop() # Outputs 'Sia'

你可以迭代列表元素,如下所示:

for element in my_list:
    print (element)

元組

tuple 類似於列表,除了它是固定長度和不可變的。因此,元組中的值不能更改,也不能將值新增到元組或從元組中刪除。元組通常用於不需要更改的小型值集合,例如 IP 地址和埠。元組用括號表示而不是方括號:

ip_address = ('10.20.30.40', 8080)

列表的相同索引規則也適用於元組。元組也可以巢狀,值可以是任何有效的 Python 有效。

必須以這種方式定義只有一個成員的元組(注意逗號):

one_member_tuple = ('Only member',)

要麼

one_member_tuple = 'Only member',   # No brackets

或者只是使用 tuple 語法

one_member_tuple = tuple(['Only member'])

字典

Python 中的 dictionary 是鍵值對的集合。字典被花括號包圍。每對用逗號分隔,鍵和值用冒號分隔。這是一個例子:

state_capitals = {
    'Arkansas': 'Little Rock',
    'Colorado': 'Denver',
    'California': 'Sacramento', 
    'Georgia': 'Atlanta'
}

要獲取值,請通過其鍵引用它:

ca_capital = state_capitals['California']

你還可以獲取字典中的所有鍵,然後迭代它們:

for k in state_capitals.keys():
    print('{} is the capital of {}'.format(state_capitals[k], k))

字典非常類似於 JSON 語法。Python 標準庫中的本機 json 模組可用於在 JSON 和字典之間進行轉換。

set 是元素的集合,沒有重複,沒有插入順序,但排序順序。它們用於以下情況:將某些事物組合在一起非常重要,而不是包含它們的順序。對於大型資料組,檢查元素是否在 set 中要比對 list 執行相同操作要快得多。

定義 set 非常類似於定義 dictionary

first_names = {'Adam', 'Beth', 'Charlie'}

或者你可以使用現有的 list 構建一個 set

my_list = [1,2,3]
my_set = set(my_list)

使用 in 檢查 set 的成員資格:

if name in first_names:
    print(name)

你可以像列表一樣遍歷 set,但請記住:值將以任意實現定義的順序進行。

defaultdict

defaultdict 是一個具有鍵預設值的字典,因此可以無錯誤地訪問未明確定義任何值的鍵。當字典中的值是集合(列表,字串等)時,defaultdict 特別有用,因為每次使用新金鑰時都不需要初始化它。

defaultdict 永遠不會引發 KeyError。任何不存在的鍵都會返回預設值。

例如,請考慮以下字典

>>> state_capitals = {
    'Arkansas': 'Little Rock',
    'Colorado': 'Denver',
    'California': 'Sacramento', 
    'Georgia': 'Atlanta'
}

如果我們嘗試訪問一個不存在的鍵,python 會返回一個錯誤,如下所示

>>> state_capitals['Alabama']
Traceback (most recent call last):

  File "<ipython-input-61-236329695e6f>", line 1, in <module>
    state_capitals['Alabama']

KeyError: 'Alabama'

讓我們嘗試一下 defaultdict。它可以在 collections 模組中找到。

>>> from collections import defaultdict
>>> state_capitals = defaultdict(lambda: 'Boston')

我們在這裡做的是設定一個預設值( 波士頓 ),以防 Give 鍵不存在。現在像以前一樣填充 dict:

>>> state_capitals['Arkansas'] = 'Little Rock'
>>> state_capitals['California'] = 'Sacramento'
>>> state_capitals['Colorado'] = 'Denver'
>>> state_capitals['Georgia'] = 'Atlanta'

如果我們嘗試使用不存在的金鑰訪問 dict,python 將返回預設值,即 Boston

>>> state_capitals['Alabama']
'Boston'

並返回現有鍵的建立值,就像普通的 dictionary 一樣

>>> state_capitals['Arkansas']
'Little Rock'