Python中的四種數據結構


轉自 https://www.cnblogs.com/pychina/p/10219772.html

 

Python中的內置數據結構(Built-in Data Structure):列表list、元組tuple、字典dict、集合set,涵蓋的僅有部分重點。

 目錄:

一、列表list

二、元組tuple

三、字典dict

四、集合set

 


一、列表list


 

list的顯著特征:

  1. 列表中的每個元素都可變的,意味着可以對每個元素進行修改和刪除;
  2. 列表是有序的,每個元素的位置是確定的,可以用索引去訪問每個元素;
  3. 列表中的元素可以是Python中的任何對象;
  4. 可以為任意對象就意味着元素可以是字符串、整數、元組、也可以是list等Python中的對象。

----數據操作:

1、直接創建列表

mylist = ['Google', 'Yahoo', 'Baidu']

2、對列表中的指定位置變更數據

復制代碼
mylist = ['Google', 'Yahoo', 'Baidu']

#變更索引位置1Yahoo的內容為Microsoft
mylist[1] = 'Microsoft'


#運行結果: ['Google', 'Microsoft', 'Baidu']
復制代碼

3、在列表后面追加元素

mylist.append('Alibaba')  #運行結果: ['Google', 'Microsoft', 'Baidu', 'Alibaba']

一、列表

4、在指定位置插入元素

mylist.insert(1, 'Tencent')  # ['Google', 'Tencent', 'Microsoft', 'Baidu', 'Alibaba']

5、刪除元素

復制代碼
mylist = ['Google', 'Tencent', 'Microsoft', 'Baidu', 'Alibaba']

# 刪除尾部元素
mylist.pop()      # 會返回被刪除元素
# 刪除指定位置的元素
mylist.pop(1)  # 刪除索引為1的元素,並返回刪除的元素

mylist.remove('Microsoft') #刪除列表中的Microsoft

del mylist[1:3]       #刪除列表中索引位置1到位置 3 的數據
復制代碼

6、替換元素

mylist[0] = 'Baidu'
mylist[1] = ['python', 'java', 'php']  # 集合的數據類型可以不同,也可以是集合

7、列表排序

mylist = [1, 2, 5, 4]
mylist.sort()          # [1, 2 ,4, 5]

如果列表里面是字母,則根據Ascii碼來排序

8、獲取列表長度

mylist = [1, 2, 5, 4]
len(mylist)

9、獲取列表指定位置的數據

復制代碼
mylist = ['Google', 'Tencent', 'Microsoft', 'Baidu', 'Alibaba','Sina']
#獲取索引位置1的數據
mylist[1]        #'Tencent'
#獲取索引位置1到5的數據,注意這里只會取到索引位置4,這里叫做取頭不取尾
mylist[1:5]   # 'Tencent', 'Microsoft', 'Baidu', 'Alibaba'
#獲取從最頭到索引位置5的數據
mylist[ :5]   #'Google', 'Tencent', 'Microsoft', 'Baidu', 'Alibaba'

#獲取從索引位置2開到最后的數據
mylist[2:]    #'Microsoft', 'Baidu', 'Alibaba','Sina'
復制代碼

10、用循環來創建列表

復制代碼
a = [1,2,3,4,5,6]
#在a的數據基礎上每個數據乘以10,再生成一個列表b,
b = [i*10 for i in a]
print(a)
print(b)

#運行結果如下:
#    [1, 2, 3, 4, 5, 6]
#    [10, 20, 30, 40, 50, 60]
復制代碼

11、過濾列表中的內容放入新的列表中

復制代碼
#生成一個從1到20的列表

a = [x for x in range(1,20)]

#把a中所有偶數生成一個新的列表b

b = [m for m in a if m % 2 == 0]

print(b)


#運行結果如下:
#        [2, 4, 6, 8, 10, 12, 14, 16, 18]
復制代碼

12、嵌套式生成列表

復制代碼
#生成一個列表a
a = [i for i in range(1,4)]
print(a)

#生成一個列表b
b = [i for i in range(100,400) if i % 100 == 0]
print(b)

# 嵌套式 
c = [m+n for m in a for n in b]
print(c)


#運行結果:
#    [1, 2, 3]
#    [100, 200, 300]
#    [101, 201, 301, 102, 202, 302, 103, 203, 303]
復制代碼

 

Python中包含6中內建的序列:列表,元組,字符串、Unicode字符串、buffer對象和xrange對象。

----list函數

>>> list("Hello world")
['H', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd']

可以通過list將序列創建為列表。

其實list為一種類型並非函數,但此處二者並無多大區別。下面的tuple、dict也是如此。

二、元組tuple


 

重點:元組Tuple,用法與List類似,但Tuple一經初始化,就不能修改,沒有List中的append(), insert(), pop()等修改的方法,只能對元素進行查詢

下面看個例子來證實一下我們說的:

復制代碼
>>> a = (1,2,3,4)
>>> a
(1, 2, 3, 4)
>>> print(type(a))
<class 'tuple'>
>>> a[1]=5
Traceback (most recent call last):
  File "<pyshell#3>", line 1, in <module>
    a[1]=5
TypeError: 'tuple' object does not support item assignment
>>> a[1:1] = 5
Traceback (most recent call last):
  File "<pyshell#4>", line 1, in <module>
    a[1:1] = 5
TypeError: 'tuple' object does not support item assignment
>>> a[1]
2
復制代碼

從上面的例子,證實了tuple不支持對元素的修改(包括刪除),tuple一初始化便固定下來了。

再來看一個例子:

復制代碼
>>> a = ('a','b',['A','B'])
>>> print(type(a))      #檢測a的數據類型是什么
<class 'tuple'>        #檢測出a的類型是元組tuple
>>> print(a)
('a', 'b', ['A', 'B'])
>>> a[2][0] = 'X'    #嘗試變更數據,成功了,為什么?
>>> a[2][1] = 'y'
>>> print(a)            #打印出變更后的內容
('a', 'b', ['X', 'y'])
>>> print(type(a[2]))    #檢測a的數據類型是什么
<class 'list'>                #檢測出a[2]的類型是list
復制代碼

這里看似元素中的元素改變了,可是仔細分析下,元組中的第三個元素是一個列表。

代碼4,5行改變的是列表中的值,元組所指的這個元素列表並沒有改變,需要注意這點!

這就涉及到Python中的可變對象和不可變對象,像list這樣的就是可變對象,tuple便是不可變對象。

元組是固定的列表,那么元組的意義何在呢?

因為tuple不可變,所以代碼更安全。如果可能,能用tuple代替list就盡量用tuple並且需要注意元組中元素的可變性!!

空的tuple可以記為(),若只有一個元素的tuple記為(1,)

t = (1,)  # 如果需要是Tuple,就必須加上逗號,否則變成成了數字1了
# 這里如果沒有“,”就變成了“(1)”

因為記為(1)的話,這個實際代表的是數字1,此時()是數學公式中的小括號

因為元組是固定的列表,所以其內置的大多數的方法和列表是差不多的。

可以通過tuple將序列轉換為元組,用法和list一樣

>>> tuple('Hello,world!')
('H', 'e', 'l', 'l', 'o', ',', 'w', 'o', 'r', 'l', 'd', '!')

 

三、字典dict(dictionary)


 

        字典dictionary全稱這個概念就是基於現實生活中的字典原型,生活中的使用名稱-內容對數據進行構建,Python中使用鍵(key)-值(value)存儲,也就是java、C++中的map。

 

dict的顯著特征:


 

  • 字典中的數據必須以鍵值對的形式出現,即k,v: 

      key:必須是可哈希的值,比如intmstring,float,tuple,但是,list,set,dict不行 

      value:任何值

  • 鍵不可重復,值可重復

      鍵若重復字典中只會記該鍵對應的最后一個值

  • 字典中鍵(key)是不可變的,何為不可變對象,不能進行修改;而值(value)是可以修改的,可以是任何對象。

      在dict中是根據key來計算value的存儲位置,如果每次計算相同的key得出的結果不同,那dict內部就完全混亂了。

 

----字典生成創建方式 

復制代碼
#創建空字典1
    
d = {}
print(d)

#創建空字典2
d = dict()

#直接賦值方式

d = {"one":1,"two":2,"three":3,"four":4}


#常規字典生成式

dd = {k:v for k,v in d.items()}
print(dd)

#加限制條件的字典生成方式

ddd = {k:v for k,v in d.items() if v % 2 ==0}
print(ddd)
復制代碼

 

----字典的常見操作_____訪問、刪除、變更字典里面的內容

復制代碼
#訪問字典中的數據
d = {"one":1,"two":2,"three":3,"four":4}
print(d["one"])
#變更字典里面的數據
d["one"] = "eins"
print(d)

#刪除一個數據,使用del
del d["one"]
print(d)

#運行結果如下:
1
{'one': 'eins', 'two': 2, 'three': 3, 'four': 4}
{'two': 2, 'three': 3, 'four': 4}
復制代碼

----字典中成員檢測

復制代碼
d = {"one":1,"two":2,"three":3,"four":4}

if 2 in d:
    print("value")
    
if "two" in d:
    print("key")
    
if ("two",2) in d:
    print("kv")
復制代碼

----使用for循環訪問字典

復制代碼
d = {"one":1,"two":2,"three":3,"four":4}
#使用for循環,直接按key值訪問

for k in d:
    print(k,d[k])
    
#上述代碼也可以寫成如下
    
for k in d.keys():
    print(k,d[k])

#只訪問字典的值

for v in d.values():
    print(v)

#以下是特殊用法

for k,v in d.items():
    print(k,'--->',v)
復制代碼

----字典相關函數

通用函數:len,max,min,dict

d = {"one":1,"two":2,"three":3,"four":4}
print(max(d))
print(min(d))
print(len(d))

dict() 函數的使用方法:

復制代碼
dict0 = dict()  # 傳一個空字典
print('dict0:', dict0)
 
dict1 = dict({'three': 3, 'four': 4})  # 傳一個字典
print('dict1:', dict1)
 
dict2 = dict(five=5, six=6)  # 傳關鍵字
print('dict2:', dict2)
 
dict3 = dict([('seven', 7), ('eight', 8)])  # 傳一個包含一個或多個元祖的列表
print('dict3:', dict3)
 
dict5 = dict(zip(['eleven', 'twelve'], [11, 12]))  # 傳一個zip()函數
print('dict5:', dict5)
復制代碼

str(字典):返回字典的字符串格式

d = {"one":1,"two":2,"three":3,"four":4}

print(str(d))

clear:清空字典

items:返回字典的鍵值對組成的元組格式

復制代碼
d = {"one":1,"two":2,"three":3,"four":4}

i = d.items()
print(type(i))
print(i)

d.clear()
print(d)
復制代碼

keys:返回字典的鍵組成的一個結構

d = {"one":1,"two":2,"three":3,"four":4}
k = d.keys()
print(type(k))
print(k)

values:返回字典的值組成的一個結構

d = {"one":1,"two":2,"three":3,"four":4}
v = d.values()
print(type(v))
print(v)

get:根據制定鍵返回相應的值,好處是可以設置默認值

復制代碼
d = {"one":1,"two":2,"three":3,"four":4}

print(d.get("one333"))

#get默認值是None,可以設置
print(d.get("one",100))
print(d.get("one222",100))
復制代碼

fromkeys:使用指定的序列作為鍵,使用一個值作為字典的所有的鍵的值

p = ["one","two","three","four",]
#注意fromkeys兩個參數的類型
#注意fromkeys的調用主體
d = dict.fromkeys(p,"222")
print(d)

 

四、集合set


 

  • 集合更接近數學上集合的概念。集合中每個元素都是無序的、不重復的任意對象。
  • 可以通過集合去判斷數據的從屬關系,也可以通過集合把數據結構中重復的元素減掉。集合可做集合運算,可添加和刪除元素。
  • 集合內數據無序,即無法使用索引和分片
  • 集合內部數據元素具有唯一性,可以用來排除重復數據
  • 集合內的數據:str,int,float,tuple,冰凍集合等,即內部只能放置可哈希數據
----集合的定義
復制代碼
#集合的定義,set()
s = set()
print(type(s))
print(s)

#也可以像下面這樣做,大括號內一定要有值,否則定義出的將是一個dict
s = {1,2,3,4,5,6,7}
print(s)
復制代碼

創建集合時需要用list作為輸入集合,可通過add()方法增加元素,remove()方法刪除元素

s = set([1,2,3])
s.add(6)
s.remove(2)

集合的內涵

普通集合內涵
--------以下集合會在初始化后自動過濾掉重復元素

s = {33,1,33,6,9,126,8,6,3,77,88,99,126}
print(s)

普通循環集合內涵

s = {33,1,33,6,9,126,8,6,3,77,88,99,126}
ss = {i for i in s}
print(ss)

帶條件的集合內涵

s = {33,1,33,6,9,126,8,6,3,77,88,99,126}
sss = {i for i in s if i % 2 ==0}
print(sss)

多循環集合的內涵

s1 = {1,2,3,4}
s2 = {"nice","to","meet","you"}

s = {m*n for m in s2 for n in s1}
print(s)

----集合函數

  •  intersection:交集
  • difference:差集
  • union:並集
  • issubset:檢查一個集合是否為另一個子集
  • issuperset:檢查一個集合是否為另一個超集 

通過代碼來看區別:

復制代碼
s1 = {1,2,3,4,5,6,7}
s2 = {5,6,7,8,9}

#交集
s_1 = s1.intersection(s2)
print("交集:",s_1)

#差集
s_2 = s1.difference(s2)
print("差集:",s_2)

#並集
s_3 = s1.union(s2)
print("並集:",s_3)

#檢查一個集合是否為另一個子集
s_4 = s1.issubset(s2)
print("檢查子集結果:",s_4)

#檢查一個集合是否為另一個超集
s_5 = s1.issuperset(s2)
print("檢查超集結果:",s_5)
復制代碼
這里是運行結果:
交集: {5, 6, 7} 差集: {1, 2, 3, 4} 並集: {1, 2, 3, 4, 5, 6, 7, 8, 9} 檢查子集結果: False 檢查超集結果: False

frozen set:冰凍集合

  • 冰凍集合是不可以進行任何修改的集合
  • frozenset是一種特殊集合

創建冰凍集合的方式:

s = frozenset()

  

每天進步一點點,不要停止前進的腳步


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM