數據結構可以說是相互之間存在一種或者多種特定關係的數據類型的集合,相比於其他編程語言Python的數據結構更加靈活。
Python中常用的序列結構有:列表、元組、字典、集合、字符串等。
有序序列:列表、元組、字符串
無序序列:字典、集合、(range、Zip、map、enumerate等)
其中,列表、字典、集合又屬於可變序列,其餘屬於不可變序列
序列是Python中最基本的數據結構。列表元組字符串等序列支持雙向索引。序列中的每個元素都分配一個數字 - 它的位置,或索引,第一個索引是0,第二個索引是1,依此類推。
1. 列表[list]
列表是連續有序內存空間。同一個列表中元素的數據類型可以各不相同,可同時爲整數,實數,字符串等類型,也可爲列表,元組,字典,集合或其他自定義對象。
注:Python採用的是基於值的內存管理模式,列表中元素是存儲值的引用。
列表操作:
Python 表達式 | 結果 | 描述 |
---|---|---|
len([1, 2, 3]) | 3 | 長度 |
[1, 2, 3] + [4, 5, 6] | [1, 2, 3, 4, 5, 6] | 組合 |
['Hi!'] * 4 | ['Hi!', 'Hi!', 'Hi!', 'Hi!'] | 重複 |
3 in [1, 2, 3] | True | 元素是否存在於列表中 |
for x in [1, 2, 3]: print x, | 1 2 3 | 迭代 |
列表函數:
1 | cmp(list1, list2) 比較兩個列表的元素 |
2 | len(list) 列表元素個數 |
3 | max(list) 返回列表元素最大值 |
4 | min(list) 返回列表元素最小值 |
5 | list(seq) 將元組轉換爲列表 |
常用方法:
1 | list.append(x) 在列表末尾添加新的元素x |
2 | list.count(x) 返回指定元素x在列表中出現的次數 |
3 | list.extend(L) 將列表L所有元素添加至列表list尾部 |
4 | list.index(x) 返回列表中第一個值爲x的元素的下表,若不存在則拋出異常 |
5 | list.insert(index, x) 指定位置插入元素x,後面元素後移一個位置 |
6 | list.pop(obj=list[-1]) 移除並返回列表中的指定位置的一個元素(默認最後一個元素-1) |
7 | list.remove(x) 移除列表中首次出現的指定元素 |
8 | list.reverse() 逆序 |
9 | list.sort(key,reverse=False) 排序:key指定排序依據,reverse指定升序(False)還是降序(True) |
2. 元組(tup)
Python的元組與列表類似,不同之處在於元組的元素不能修改。
序號 | 方法及描述 |
---|---|
1 | cmp(tuple1, tuple2) 比較兩個元組元素。 |
2 | len(tuple) 計算元組元素個數。 |
3 | max(tuple) 返回元組中元素最大值。 |
4 | min(tuple) 返回元組中元素最小值。 |
5 | tuple(seq) 將列表轉換爲元組。 |
3. 字典{}
字典由鍵和對應值成對組成。字典也被稱作關聯數組或哈希表,鍵必須獨一無二,但值則不必。值可以取任何數據類型,但必須是不可變的,如字符串,數或元組。
dict = {'Alice': '2341', 'Beth': '9102', 'Cecil': '3258'}
print dict['Name'] #訪問
向字典添加新內容的方法是增加新的鍵/值對,修改或刪除已有鍵/值對
dict['Beth']=100 #update
dist['Age']=7 #add
del dict['Name']; # 刪除鍵是'Name'的條目
dict.clear(); # 清空詞典所有條目
del dict ; # 刪除詞典
1)不允許同一個鍵出現兩次
2)鍵必須不可變,所以可以用數,字符串或元組充當,所以用列表就不行,
字典函數:
1 | cmp(dict1, dict2) 比較兩個字典元素。 |
2 | len(dict) 計算字典元素個數,即鍵的總數。 |
3 | str(dict) 輸出字典可打印的字符串表示。 |
4 | type(variable) 返回輸入的變量類型,如果變量是字典就返回字典類型。 |
常用方法:
1 | radiansdict.clear() 刪除字典內所有元素 |
2 | radiansdict.copy() 返回一個字典的淺複製 |
3 | radiansdict.fromkeys() 創建一個新字典,以序列seq中元素做字典的鍵,val爲字典所有鍵對應的初始值 |
4 | radiansdict.get(key, default=None) 返回指定鍵的值,如果值不在字典中返回default值 |
5 | radiansdict.has_key(key) 如果鍵在字典dict裏返回true,否則返回false |
6 | radiansdict.items() 以列表返回可遍歷的(鍵, 值) 元組數組 |
7 | radiansdict.keys() 以列表返回一個字典所有的鍵 |
8 | radiansdict.setdefault(key, default=None) 和get()類似, 但如果鍵不已經存在於字典中,將會添加鍵並將值設爲default |
9 | radiansdict.update(dict2) 把字典dict2的鍵/值對更新到dict裏 |
10 | radiansdict.values() 以列表返回字典中的所有值 |
4. 集合{}
關於集合,維基百科這樣描述:
集合是基本的數學概念,它是集合論的研究對象,指具有某種特定性質的事物的總體,(在最原始的集合論─樸素集合論─中的定義,集合就是“一堆東西”。)集合裏的事物(“東西”),叫作元素。若然 x 是集合 A 的元素,記作 x ∈ A。
在 Python 中,集合分爲兩類:
set:可變集合,可原地修改(可哈希)
frozenset:不可變集合,相反
方法 | 描述 |
---|---|
add() | 將元素添加到集合中 |
clear() | 刪除集合中的所有元素 |
copy() | 返回集合的淺拷貝 |
difference() | 將兩個或多個集合的差集作爲一個新集合返回 |
difference_update() | 從這個集合中刪除另一個集合的所有元素 |
discard() | 刪除集合中的一個元素(如果元素不存在,則不執行任何操作) |
intersection() | 將兩個集合的交集作爲一個新集合返回 |
intersection_update() | 用自己和另一個的交集來更新這個集合 |
isdisjoint() | 如果兩個集合有一個空交集,返回 True |
issubset() | 如果另一個集合包含這個集合,返回 True |
issuperset() | 如果這個集合包含另一個集合,返回 True |
pop() | 刪除並返回任意的集合元素(如果集合爲空,會引發 KeyError) |
remove() | 刪除集合中的一個元素(如果元素不存在,會引發 KeyError) |
symmetric_difference() | 將兩個集合的對稱差作爲一個新集合返回 |
symmetric_difference_update() | 用自己和另一個的對稱差來更新這個集合 |
union() | 將集合的並集作爲一個新集合返回 |
update() | 用自己和另一個的並集來更新這個集合 |
我們在高中時曾學過,集合有以下特性:
- 無序性:一個集合中,每個元素的地位都是相同的,元素之間是無序的。
集合上可以定義序關係,定義了序關係後,元素之間就可以按照序關係排序。但就集合本身的特性而言,元素之間沒有必然的序。 - 互異性:一個集合中,任何兩個元素都認爲是不相同的,即每個元素只能出現一次。
有時需要對同一元素出現多次的情形進行刻畫,可以使用多重集,其中的元素允許出現多次。 - 確定性:給定一個集合,任給一個元素,該元素或者屬於或者不屬於該集合,二者必居其一,不允許有模棱兩可的情況出現。