Python 集合、字典、運算符


先區分一下序列類型和散列類型:

序列類型:list、string、tuple,他們中的元素是有序的。

散列類型:set、dict,他們中的元素無序的。

序列類型有序,可以用索引。而散列類型中的元素是無序的,所以不能索引。

 

一、集合

(一).集合的特性:無序、唯一、可變。集合中的元素需要可哈希的,元素不可以是可變對象。

定義一個集合:

(1).工廠方法:se = set()

注意不要寫成 se = () 這樣變成元組了。

(2).直接定義:se = {1,2,3} 用大括號括起來。

大括號中要寫入元素,不寫元素就是一個空字典了。

(3).案例分析:

# 分析這兩種定義,哪一個會報錯?
s1 = {1, ['a', 'b', 'c']} 
s2 = {1, ('a', 'b', 'c')}

第一種會報錯。TypeError: unhashable type: 'list'

因為集合中的元素要符合不可變這個規則, 列表可變,不符合規則,報錯了。

第二種,元組不可變,符合規則,所以解釋器不會跟你叫勁。

至於什么是可哈希?往下翻……

(二).集合的運算

(1).檢查成員:in / not in

語法:item in set_object -> bool

例:

>>>se = {1,2,'abc'}
>>>"abc" in se
True
>>>5 in se
False

not in 就是取反,不演示了

(2).交集:&

兩個集合共同有的元素,取兩個集合重復的元素。

例:

# 1.有兩個列表 x = [1,2,3,'a','b','c']  y = ['a','b','c'] 找出x,y列表中,共有元素

x = [1, 2, 3, 'a', 'b', 'c']
y = ['a', 'b', 'c']

print(set(x) & set(y))
"""
列表沒有交集"&"的功能,但是集合有。
那么先工廠一下,然后再交集。

運行結果:
{'c', 'b', 'a'}  # 集合無序,所以元素輸出的順序未必如自己預想的
"""

為什么運行結果的順序是亂的?因為集合無序的!

(3).並集:|(shift+回車上面那個)

取出不重復的值。字面意思理解,並集,並在一起了(相當於變成一個集合了,集合的特性之一:元素唯一)。

例:

>>>se1 = {1,2,3}
>>>se2 = {4,2,3}
>>>se1 | se2
{1,2,3,4}

(4).差集:-

剪掉兩個集合中的重復部分。

>>>se1 = {1,2,3,4,5}
>>>se2 = {4,5,6,7,8}
>>>se1 - se2
{1,2,3}

(5).與非集:^(脫字符 shift+6)

取兩個集合各自獨有的元素。

>>>se1 = {1,2,3,4,5}
>>>se1 = {4,5,6,7,8}
>>>se1 ^ se2
{1,2,3,6,7,8}

(6).小技巧:如何去重元素:

a = [1,2,3,'a','b','c','a','b','a',3]
#工廠一下,set()
print(set(a))  #{1,2,3,'c','b','a'}

要記得集合的特性之一:唯一性,集合中的每個元素都是唯一的。仍舊工廠一下,就可以了。如果想要輸出是列表,那么就再工廠一下。

(三).集合的常用方法

(1).set.add() 添加單個元素

(2).set.update(iterable) 批量更新,會去重。

 

二、字典

(一).字典的特性:key唯一、無序、可變。key是唯一的,需不可變對象,重復的話會覆蓋值。key要符合變量命名規則!

定義一個字典:

(1).直接大括號:di = {} 是一個空字典

type(di)之后:<class 'dict'>

注意要與集合區別開來!

一般是直接把值寫進去了。語法:di = {key1:value,key2:value,...} 鍵值對是冒號的形式

例:

>>>di = {'name':'mkcry','age':23}
>>>di
{'name':'mkcry','age':23}

(2).工廠方式:di = dict(key1=value,key2=value,...) 鍵值對用等號"="等起來

例:

>>>di = dict('name'='???','age'=88)
SyntaxError:keyword can't be an expression
>>>di = dict(name='???',age=88)
>>>di
{'name':'???','age':88}

工廠方式容易寫錯,記得工廠方式的key不要加引號!

(3).案例分析:

#分析這兩種定義,哪一個會報錯?
di1 = {'a':'test',('a','b'):'test'}
di2 = {'a':'test',('a','b'):'test'}

第二種會報錯。TypeError: unhashable type: 'set'

key需要的是不可變的對象。第二種里有一個集合,集合的特性之一是可變,不符合key的規則,解釋器跟你急了。

而第一種里是一個元組,元組不可變,沒問題了。

(二).往字典里插入值

di = {}

# 直接賦值一樣
di["name"] = "quanquan616"

"""
get(key) 如果key不存在,不會報錯。取到了會返回原有值。
get(key,value) 當key不存在的時候,會返回value的值,常用來提示。
"""
di.get("sex", "沒有這個鍵")
"""
如果要插入值,可以這么做:
di["name"] = di.get("name","")+"zyb"
di["sex"] = di.get("sex","male")
di["age"] = di.get("age",0)+30
di -> {'name': 'zyb', 'sex': 'male', 'age': 30}
"""

"""
setdefault(key,value) 字面理解,設置默認。
key有的話會返回原有值,無此key才會設置。
如果此key已有,不會改變原有值,不會被更新
"""
di.setdefault("name", "zyb")

"""
update(dict_object) 參數需要是一個字典對象。
有就改變,沒有就添加進去。
"""
di.update({"age": 35, "read": 15})

# fromkeys(iterable,value) 批量設置,所有的值都是一樣的。不會改變原有字典
di.fromkeys("abc", 30)

print(di)
# {'name': 'quanquan616', 'age': 35, 'read': 15}
View Code

(三).對字典進行取值。字典是鍵值對存在,取值需要通過key來取值。

# 直接用鍵進行取值,Dict[key]
print(di["name"])  # quanquan616

# get(key) 取到了就返回值,沒有取到不會報錯
print(di.get("name"))  # quanquan616

# get()的另一種用法
di = {}
di["name"] = di.get("name", "") + "zyb"
print(di)  # {'name': 'zyb'}

# setdefault(key) 有就返回這個鍵的值。如果沒有這個鍵,會創建,不指定值的話,會是None。不會因為指定了值而改變原有數據。
print(di.setdefault("name"))  # quanquan616

# values() 取出所有的值,返回一個迭代器
print(di.values())  # dict_values(['quanquan616', 35, 15])
View Code

(四).字典小技巧

(1).對字典中的元素進行排序

di = {"in": 123, "to": 511, "she": 255, "i": 111}

print(sorted(di.items(), key=lambda item: item[1], reverse=True))
# 運行結果:[('to', 511), ('she', 255), ('in', 123), ('i', 111)]

"""
di.items() 將字典轉化為可迭代對象。Dict.items()將字典中的key-value元素,轉化為了元組
# [('in', 123), ('to', 511), ('she', 255), ('i', 111)]

key=lambda item: item[1] 取元素中的第二個元素作為比較的參數
"""

注意此方法中,value的值只能是數值,如果出現字符串就會報錯。(字符串和數值能直接做比較嗎?)

 

三、運算符(部分簡單的運算符之前已有摘錄,不在這里重復了,遇到實際情況不會了直接google it)

(一).身份運算符:is / is not

兩個對象,是否指向同一個id。(id和內存地址還是有區別的)

>>>a = 'jack'
>>>b ='jack'
>>>id(a)
32342752
>>>id(b)
32342752
>>> a is b
True

注意區分"=="和"is":

==用來判斷兩個值是否相等,is是判斷兩個對象的id是否相同。

(二).邏輯運算符 not > and > or

>>>a = True;b = False
>>>b and a or b
False
>>> a or b and a
True
>>> a or b and b
True

四、哈希

hash(object)生成一個唯一的哈希值。

小技巧:這個內置函數,可以來判斷一個對象是否是可變的。可生存哈希值的就是不可變對象。


免責聲明!

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



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