2.8. s.update( "字符串" ) 與 s.update( {"字符串"} ) 的區別 11
字典是另一種可變容器模型,且可存儲任意類型對象.
字典的每個鍵值(key,value)對用冒號(:)分隔,每個對之間用逗號(,)分隔,整個字典包括在花括號({})中,格式如下:
d={key1:value1,key2:value2}
鍵必須是唯一的,但值則不必.
值可以取任何數據類型,但鍵必須是不可變的,如字符串,數字或元組.
吧相應的鍵放入到方括號中
dict = {'Name': 'Runoob', 'Age': 7, 'Class': 'First'}
print ("dict['Name']: ", dict['Name'])
print ("dict['Age']: ", dict['Age'])
dict['Name']: Runoob
dict['Age']: 7
向字典添加新內容的方法是增加新的鍵/值對,修改或刪除已有鍵/值對
dict = {'Name': 'Runoob', 'Age': 7, 'Class': 'First'}
dict['Age'] = 8; # 更新 Age
dict['School'] = "菜鳥教程" # 添加信息
print ("dict['Age']: ", dict['Age'])
print ("dict['School']: ", dict['School'])
dict['Age']: 8
dict['School']: 菜鳥教程
能刪單一的元素也能清空字典,清空只需一項操作.
顯示刪除一個字典用del命令.
dict1 = {'Name': 'Runoob', 'Age': 7, 'Class': 'First'}
del dict1['Name'] # 刪除鍵 'Name'
dict1.clear() # 清空字典
del dict 1 # 刪除字典
print ("dict1['Age']: ", dict1['Age'])
print ("dic1t['School']: ", dict1['School'])
但這回引發一個異常,因爲最後一個del操作後,字典不存在
Traceback (most recent call last):
File "test.py", line 9, in <module>
print ("dict['Age']: ", dict['Age'])
TypeError: 'type' object is not subscriptable
字典值可以是任何的python對象,既可以是標準的對象,也可以使用戶定義的,但鍵不行.
注意:
1.不允許同一個鍵出現兩次.創建時如果同一個鍵被賦值兩次,後一個值會被記住,即前一個該鍵的值會被代替.
2.鍵必須不可變,所以可以用數字,字符串或元組充當,而用列表就不行.
dict = {['Name']: 'Runoob', 'Age': 7}
print ("dict['Name']: ", dict['Name'])
以上實例輸出結果:
Traceback (most recent call last):
File "test.py", line 3, in <module>
dict = {['Name']: 'Runoob', 'Age': 7}
TypeError: unhashable type: 'list'
字典內置函數len(dict):計算字典元素個數,即鍵的總數.
str(dict):輸出字典,以可打印的字符串表示.
type(varible):返回輸入的變量類型,如果變量是字典就返回字典類型,可以用來判斷數據類型,type通用,後會細講.
字典內置方法clear():刪除字典內所有元素.
copy():返回一個字典的淺賦值.
fromkeys(seq):創建一個新字典,以序列seq中元素做字典的鍵,val爲字典所有鍵對應的初始值.一般seq都是一個列表、元組,如果seq我們寫成字典,則會把字典裏的鍵取出來用作新字典的鍵.並且新建的字典不是原來的字典.
get(key,default=None):返回指定鍵的值,如果值不存在字典中返回default值.
key in dict:如果鍵在字典dict裏返回true,否則返回false
items():以列表返回可遍歷的(鍵,值)元組數組.
keys():返回一個迭代器,可以使用list()來轉化爲列表
setdefault(key,default=None):和get()類似,但如果鍵不存在於字典中,將會添加鍵並將至設爲default.
update(dict2):把字典dict2的鍵/值對更新到dict裏
values():返回一個迭代器,可以使用list()來轉化爲列表
pop(key[,default]):刪除字典給定鍵key所對應的值,返回值爲被刪除的值.key值必須給出,否則,返回default值.
popitem():隨機返回並刪除字典中的一對鍵和值(一般刪除末尾對).
字典可以通過以下方法調換 key和 value,當然要注意原始 value 的類型,必須是不可變類型:
dic = {
'a': 1,
'b': 2,
'c': 3,
}
reverse = {v: k for k, v in dic.items()}
原理是通過zip把字典的鍵值對壓縮成一個迭代器,然後使用max獲取迭代器中最大的值.
print(dic)
print(reverse)
輸出如下:
{'a': 1, 'b': 2, 'c': 3}
{1: 'a', 2: 'b', 3: 'c'}
獲取字典中最大的值及其鍵:
prices = {
'A':123,
'B':450.1,
'C':12,
'E':444,
}
max_prices = max(zip(prices.values(), prices.keys()))
print(max_prices) # (450.1, 'B')
Python3.x 中會碰到這樣的問題:
>>> sites_link = {'runoog':'runoob.com', 'google':'google.com'}
>>> sides = sites_link.keys()
>>> print(sides[0])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'dict_keys' object does not support indexing
>>>
原因說明及解決方法:
dict.values()
dict.keys()
在 python2.x dict.keys 返回一個列表,但是在在 Python 3.x 下,dict.keys 返回的是 dict_keys 對象,若需要轉換爲列表,請使用:
list(dict.values())
list(dict.keys())
修改上面實例:
>>> sites_link = {'runoog':'runoob.com', 'google':'google.com'}
>>> sides = sites_link.keys()
>>> list(sides)
['runoog', 'google']
>>>
>>>a = {x for x in 'abracadabra' if x not in 'abc'}
>>> a
{'r', 'd'}
集合是一個無序不重複元素的序列.
可以使用大括號{}或者set()函數創建集合,注意:創建一個空集合必須用set()而不是{},因爲{}是用來創建一個字典.
>>>basket = {'apple', 'orange', 'apple', 'pear', 'orange', 'banana'}
>>> print(basket) # 這裏演示的是去重功能
{'orange', 'banana', 'pear', 'apple'}
>>> 'orange' in basket # 快速判斷元素是否在集合內
True
>>> 'crabgrass' in basket
False
>>> # 下面展示兩個集合間的運算.
...
>>> a = set('abracadabra')
>>> b = set('alacazam')
>>> a
{'a', 'r', 'b', 'c', 'd'}
>>> a - b # 集合a中包含元素
{'r', 'd', 'b'}
>>> a | b # 集合a或b中包含的所有元素
{'a', 'c', 'r', 'd', 'b', 'm', 'z', 'l'}
>>> a & b # 集合a和b中都包含了的元素
{'a', 'c'}
>>> a ^ b # 不同時包含於a和b的元素
{'r', 'd', 'b', 'm', 'z', 'l'}
語法格式如下:
s.add( x )
將元素 x 添加到集合 s 中,如果元素已存在,則不進行任何操作。
實例(Python 3.0+)
>>>thisset = set(("Google", "Runoob", "Taobao"))
>>> thisset.add("Facebook")
>>> print(thisset)
{'Taobao', 'Facebook', 'Google', 'Runoob'}
還有一個方法,也可以添加元素,且參數可以是列表,元組,字典等,語法格式如下:
s.update( x )
x 可以有多個,用逗號分開。
實例(Python 3.0+)
>>>thisset = set(("Google", "Runoob", "Taobao"))
>>> thisset.update({1,3})
>>> print(thisset)
{1, 3, 'Google', 'Taobao', 'Runoob'}
>>> thisset.update([1,4],[5,6])
>>> print(thisset)
{1, 3, 4, 5, 6, 'Google', 'Taobao', 'Runoob'}
>>>
語法格式如下:
s.remove( x )
將元素 x 添加到集合 s 中移除,如果元素不存在,則會發生錯誤。
實例(Python 3.0+)
>>>thisset = set(("Google", "Runoob", "Taobao"))
>>> thisset.remove("Taobao")
>>> print(thisset)
{'Google', 'Runoob'}
>>> thisset.remove("Facebook") # 不存在會發生錯誤
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'Facebook'
>>>
此外還有一個方法也是移除集合中的元素,且如果元素不存在,不會發生錯誤。格式如下所示:
s.discard( x )
實例(Python 3.0+)
>>>thisset = set(("Google", "Runoob", "Taobao"))
>>> thisset.discard("Facebook") # 不存在不會發生錯誤
>>> print(thisset)
{'Taobao', 'Google', 'Runoob'}
我們也可以設置隨機刪除集合中的一個元素,語法格式如下:
s.pop()
實例(Python 3.0+)
>>>thisset = set(("Google", "Runoob", "Taobao", "Facebook"))
>>> thisset.pop()
'Taobao'
>>> print(thisset)
{'Facebook', 'Google', 'Runoob'}
語法格式如下:
len(s)
計算集合 s 元素個數。
實例(Python 3.0+)
>>>thisset = set(("Google", "Runoob", "Taobao"))
>>> len(thisset)
3
語法格式如下:
s.clear()
清空集合 s。
實例(Python 3.0+)
>>>thisset = set(("Google", "Runoob", "Taobao"))
>>> thisset.clear()
>>> print(thisset)
set()
語法格式如下:
x in s
判斷元素 s 是否在集合 x 中存在,存在返回 True,不存在返回 False。
實例(Python 3.0+)
>>>thisset = set(("Google", "Runoob", "Taobao"))
>>> "Runoob" in thisset
True
>>> "Facebook" in thisset
False
>>>
s.update( "字符串" ) 與 s.update( {"字符串"} ) 含義不同:
s.update( {"字符串"} ) 將字符串添加到集合中,有重複的會忽略。
s.update( "字符串" ) 將字符串拆分單個字符後,然後再一個個添加到集合中,有重複的會忽略。
>>> thisset = set(("Google", "Runoob", "Taobao"))
>>> print(thisset)
{'Google', 'Runoob', 'Taobao'}
>>> thisset.update({"Facebook"})
>>> print(thisset)
{'Google', 'Runoob', 'Taobao', 'Facebook'}
>>> thisset.update("Yahoo")
>>> print(thisset)
{'h', 'o', 'Facebook', 'Google', 'Y', 'Runoob', 'Taobao', 'a'}
>>>
集合用 set.pop() 方法刪除元素的不一樣的感想如下:
1、對於 python 中列表 list、tuple 類型中的元素,轉換集合是,會去掉重複的元素如下:
>>> list = [1,1,2,3,4,5,3,1,4,6,5]
>>> set(list)
{1, 2, 3, 4, 5, 6}
>>> tuple = (2,3,5,6,3,5,2,5)
>>> set(tuple)
{2, 3, 5, 6}
2、集合對 list 和 tuple 具有排序(升序),舉例如下:
>>> set([9,4,5,2,6,7,1,8])
{1, 2, 4, 5, 6, 7, 8, 9}
>>> set([9,4,5,2,6,7,1,8])
{1, 2, 4, 5, 6, 7, 8, 9}
3、集合的 set.pop() 的不同認爲
有人認爲 set.pop() 是隨機刪除集合中的一個元素、我在這裏說句非也!對於是字典和字符轉換的集合是隨機刪除元素的。當集合是由列表和元組組成時、set.pop() 是從左邊刪除元素的如下:
列表實例:
set1 = set([9,4,5,2,6,7,1,8])
print(set1)
print(set1.pop())
print(set1)
輸出結果:
{1, 2, 4, 5, 6, 7, 8, 9}
1
{2, 4, 5, 6, 7, 8, 9}
元組實例:
set1 = set((6,3,1,7,2,9,8,0))
print(set1)
print(set1.pop())
print(set1)
輸出結果:
{0, 1, 2, 3, 6, 7, 8, 9}
0
{1, 2, 3, 6, 7, 8, 9}
首先把列表和元組轉成集合,集合會自動去重,但是因爲集合有自動排序的功能,所以這個時候列表和元組的元素
的位置是發生了變化的,即被集合自動排序了.
1、不能保證原來的順序
l = [1,1,1,1,'egon','alex','egon']
s = set(l)
print(s) # {'egon', 1, 'alex'}
l = list(s)
print(l) # ['egon', 1, 'alex']
2、不能針對可變類型去重
l = [1,1,1,1,'egon','alex','egon',{'a':1}]
s = set(l)
print(s) # 報錯
info = [
{'name':'egon', 'age':18},
{'name':'alex', 'age':73},
{'name':'egon', 'age':18},
{'name':'lxx', 'age':19},
]
l = []
for dic in info:
if dic not in l:
l.append(dic)
# l = [
{'name':'egon', 'age':18},
{'name':'alex', 'age':73},
{'name':'lxx', 'age':19},
]