天天看點

Python常用資料結構(清單、元組、字典、集合)

清單:

list1 = [1,'ans',2983,12,'Hello','nihao']
#一個清單中可以存放多個不同資料類型的值,例如上面例子中有數字也有字元串

list1.append("十四五六七")
#輸出[1, 'ans', 2983, 12, 'Hello', 'nihao', '十四五六七']
#append方法在清單末尾增加新的值

list1.insert(0,123456)
#輸出[123456, 1, 'ans', 2983, 12, 'Hello', 'nihao', '十四五六七']
#清單名.insert(下标,插入的值) 在對應下标位置插入對應的值

list1.count(1)
#輸出1,因為list1清單中隻有一個數字1
#清單名.count(值) 傳回值在清單中出現的次數

list1.remove('nihao')
#輸出[123456, 1, 'ans', 2983, 12, 'Hello', '十四五六七']
#清單名.remove(值) 從頭周遊清單,找到第一個比對的值,并删除

list1.reverse()
#輸出['十四五六七', 'Hello', 12, 2983, 'ans', 1, 123456]
#反轉list1清單

test = [1,2,3,4,5]
list1.extend(test)
#輸出['十四五六七', 'Hello', 12, 2983, 'ans', 1, 123456, 1, 2, 3, 4, 5]
#将test清單中的所有元素添加到list1清單中

list2 = [9,3,1,5,6,7,8,2]
list2.sort()
#輸出[1, 2, 3, 5, 6, 7, 8, 9]
#清單名.sort() 對清單中的元素進行排序(不可逆的)

del list1[0]
#輸出['Hello', 12, 2983, 'ans', 1, 123456, 1, 2, 3, 4, 5]
#del 清單名[下标] 删除該清單中下表對應的元素

list1.pop(0)
#輸出[12, 2983, 'ans', 1, 123456, 1, 2, 3, 4, 5]
#清單名.pop(下标) 從清單中彈出下标對應的元素,下标為空時預設彈出最後一個元素
           

清單推導式(舉例如下):

清單推導式(舉例如下):
list3 = list(map(lambda x: x**2,range(10)))
#輸出[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
等同于
list4 = [x**2 for x in range(10)]


list5 = [(x,y) for x in [1,2,3] for y in [3,1,4] if x != y]
#輸出[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]
等同于
list6 = []
for x in [1,2,3]:
    for y in [3,1,4]:
        if x != y:
            list6.append((x,y))


list7 = [x * 3 for x in [x + 123 for x in [4,5,6]]]
#清單嵌套,輸出[381, 384, 387]
           

元組:

元組是由多個用逗号分隔的值。元組是不可變的,一旦建立便隻能夠查找元素、删除整個元組。

a = 'Kobe','NAsi','DAls','Allmn'    #第一種
#a = ('Kobe', 'NAsi', 'DAls', 'Allmn') , 此時a是一個元組
#元組是不可變的,在元組中不能增加、删除、編輯元素,能夠查找元素和删除整個數組

a = ('Kode','hello','math')    #第二種
#a = ('Kode', 'hello', 'math') , a是一個元組

a = (123,)    #建立隻有一個元素的元組時,在值後面要跟一個逗号
是元組: a = (12,)    a = 12,    #type(a) = <class 'tuple'>
不是元組: a = (12)    a = 12    #type(a) = <class 'int'>
           

集合:

集合是一個無序不重複元素的集,主要作用于去重,因為集合中的元素是沒有重複的。

可以把其他資料類型轉換成集合,就可以直接把重複的元素去掉,然後再轉回原來的資料結構即可,舉例如下:

a = [1,2,3,1,2,3]
a = list(set(a))
#輸出a = [1, 2, 3],即實作去重效果,重複的元素都去掉了
           

大括号或set()函數可以用來建立集合,但set()函數可以建立空集合,{}建立的是空字典。

如果要存放一個單詞的所有字元:
a = set("Hello World!")    #傳回a = {'H', 'o', 'l', 'r', 'W', 'd', 'e', ' ', '!'},集合中元素無序排列
如果要存放一個單詞:
a = {"Hello World!"}    #傳回a = {'Hello World!'}
           

集合還支援求解交集、差集、對稱差集等數學運算。

a = {'a','b','c','d'}
a.pop()    #會從a集合中随機彈出一個元素(這裡的彈出是指在a集合中删除該元素,并将該元素傳回到輸出界面上)
a.add('dsa')    #添加該元素到集合中
           

字典:

字典是無序的鍵值對{key:value}集合,同一字典中的鍵必須是互不相同的(鍵相當于主鍵,是不能重複的)。一個大括号{}建立一個空字典。鍵值對之間用逗号分隔,這就是字典的輸出形式。

a = {"key":"value","name":"qiaozhi","age":12,"gender":"男"}
a["key"]    #傳回'value',即a["key"] = 'value'
a["number"] = 123    #在a字典中建立新的鍵值對'number': 123
#此時a = {'key': 'value', 'name': 'qiaozhi', 'age': 12, 'gender': '男', 'number': 123}
del a['number']    #删除鍵為“number”的鍵值對
#此時a = {'key': 'value', 'name': 'qiaozhi', 'age': 12, 'gender': '男'}
'number' in a    #輸出False,因為a中沒有'number'這個鍵對應的鍵值對
‘name’ in a    #輸出True,a字典中有'name'這個鍵對應的鍵值對
           

字典中的鍵是不可變類型,確定鍵的唯一性。dict()可以從包含鍵值對的元組中建立字典。

a = dict((("name","Kubo"),("age",1234)))
#輸出a = {'name': 'Kubo', 'age': 1234}
a.keys() = dict_keys(['name', 'age'])    #傳回a字典的所有鍵
a.values() = dict_values(['Kubo', 1234])    #傳回a字典的所有值
a.items() = dict_items([('name', 'Kubo'), ('age', 1234)])    #傳回a字典的所有鍵值對
           

setdefault()方法,向字典中的元素添加資料時,首先要判斷該元素是否存在,不存在則需建立一個預設值,存在的話則直接添加元素。

a = {}    #a是一個空字典
a.setdefault('book',[]).append('MySQL')
#如果a字典中沒有book鍵,則建立{'book':[]},即建立book鍵值對,預設值就是[],然後執行append添加MySQl在[]中
#如果a字典中有book鍵的鍵值對,則在book對應的值(資料類型為清單)中添加MySQL
#此時a = {'book': ['MySQL']}
a.setdefault('book',[]).append('Python')
#此時a = {'book': ['MySQL', 'Python']}
           

當索引不存在的鍵值對時,會報錯。dict.get(key,default)方法,在dict中索引key鍵時,如果key鍵不存在,則傳回default,而不會報錯。(如果key鍵存在,則傳回key鍵對應的值)

#例句如上代碼段
a['name']    #會報KeyError: 'name'錯誤
a.get('name','不存在')    #輸出:不存在
a.get('book','不存在')    #輸出:['MySQL', 'Python']
           

enumerate()方法在周遊的時候可以傳回元素索引值,适用于清單等等資料結構。

for i,j in enumerate(a['book']):
    print(i,j)
#傳回:
#0 MySQL
#1 Python

for i,j in enumerate(['a','b','c','d']):
    print(i,j)
#傳回:
#0 a
#1 b
#2 c
#3 d
           

zip()函數可以同時周遊兩個序列類型。

a = ['name','age']
b = ['Kubo',18]
for i,j in zip(a,b):
    print("{} is {}".format(i,j))
#傳回:
#name is Kubo
#age is 18