A. python字典的鍵可以修改嗎
字典的鍵,是可hash化的對象
既然是可hash話,那麼是不可改變的
B. python類中的字典,如何避免修改一個實例的字典,也修改了其他實例。
你這壓根就沒有生成新的實例啊,正確的做法應該是這樣吧:
classTest:
def__init__(self):
self.a={}
t1=Test()
t2=Test()
#這樣t1和t2才是兩個不同的實例
C. Python 為什麼list不能作為字典的key
字典里的key有一個原則,必須可哈希(有個內置函數hash()可以檢測是否支持可哈希),因為字典查找數據是通過哈希演算法得到的,比元組,列表等的數組類型快很多,這本來也是字典的特性,字典里的key和value一一對應的。
而字典查找用的就是key,那麼key就必須支持哈希演算法,也就是前面說的可哈希。
列表,是一個可變對象,支持原處修改。
你想字典里存的數據,要通過key查找,如果key是一個可變對象,上一次查找的是這樣,這一次查找key變了,就不能通過key查找value(前面說過,字典里的key和value是一一對應),成了另一個數據,但還是它自己,這就不符合規則啊,value也就無法查找出來了。
所以這就是列表不能作為字典的key原因。
D. python 列表內有字典怎麼使用
Python字典是另一種可變容器模型,且可存儲任意類型對象,如字元串、數字、元組等其他容器模型。
一、創建字典
字典由鍵和對應值成對組成。字典也被稱作關聯數組或哈希表。基本語法如下:
復制代碼代碼如下:
dict = {'Alice': '2341', 'Beth': '9102', 'Cecil': '3258'}
也可如此創建字典:
復制代碼代碼如下:
dict1 = { 'abc': 456 };
dict2 = { 'abc': 123, 98.6: 37 };
注意:
每個鍵與值用冒號隔開(:),每對用逗號,每對用逗號分割,整體放在花括弧中({})。
鍵必須獨一無二,但值則不必。
值可以取任何數據類型,但必須是不可變的,如字元串,數或元組。
二、訪問字典里的值
把相應的鍵放入熟悉的方括弧,如下實例:
復制代碼代碼如下:
#!/usr/bin/python
dict = {'Name': 'Zara', 'Age': 7, 'Class': 'First'};
print "dict['Name']: ", dict['Name'];
print "dict['Age']: ", dict['Age'];
#以上實例輸出結果:
#dict['Name']: Zara
#dict['Age']: 7
如果用字典里沒有的鍵訪問數據,會輸出錯誤如下:
復制代碼代碼如下:
#!/usr/bin/python
dict = {'Name': 'Zara', 'Age': 7, 'Class': 'First'};
print "dict['Alice']: ", dict['Alice'];
#以上實例輸出結果:
#dict['Zara']:
#Traceback (most recent call last):
# File "test.py", line 4, in <mole>
# print "dict['Alice']: ", dict['Alice'];
#KeyError: 'Alice'[/code]
三、修改字典
向字典添加新內容的方法是增加新的鍵/值對,修改或刪除已有鍵/值對如下實例:
復制代碼代碼如下:
#!/usr/bin/python
dict = {'Name': 'Zara', 'Age': 7, 'Class': 'First'};
dict['Age'] = 8; # update existing entry
dict['School'] = "DPS School"; # Add new entry
print "dict['Age']: ", dict['Age'];
print "dict['School']: ", dict['School'];
#以上實例輸出結果:
#dict['Age']: 8
#dict['School']: DPS School
四、刪除字典元素
能刪單一的元素也能清空字典,清空只需一項操作。
顯示刪除一個字典用del命令,如下實例:
復制代碼代碼如下:
#!/usr/bin/python
dict = {'Name': 'Zara', 'Age': 7, 'Class': 'First'};
del dict['Name']; # 刪除鍵是'Name'的條目
dict.clear(); # 清空詞典所有條目
del dict ; # 刪除詞典
print "dict['Age']: ", dict['Age'];
print "dict['School']: ", dict['School'];
#但這會引發一個異常,因為用del後字典不再存在:
dict['Age']:
#Traceback (most recent call last):
# File "test.py", line 8, in <mole>
# print "dict['Age']: ", dict['Age'];
#TypeError: 'type' object is unsubscriptable
五、字典鍵的特性
字典值可以沒有限制地取任何python對象,既可以是標準的對象,也可以是用戶定義的,但鍵不行。
兩個重要的點需要記住:
1)不允許同一個鍵出現兩次。創建時如果同一個鍵被賦值兩次,後一個值會被記住,如下實例:
復制代碼代碼如下:
#!/usr/bin/python
dict = {'Name': 'Zara', 'Age': 7, 'Name': 'Manni'};
print "dict['Name']: ", dict['Name'];
#以上實例輸出結果:
#dict['Name']: Manni
2)鍵必須不可變,所以可以用數,字元串或元組充當,所以用列表就不行,如下實例:
復制代碼代碼如下:
#!/usr/bin/python
dict = {['Name']: 'Zara', 'Age': 7};
print "dict['Name']: ", dict['Name'];
#以上實例輸出結果:
#Traceback (most recent call last):
# File "test.py", line 3, in <mole>
# dict = {['Name']: 'Zara', 'Age': 7};
#TypeError: list objects are unhashable
六、字典內置函數&方法
Python字典包含了以下內置函數:
1、cmp(dict1, dict2):比較兩個字典元素。
2、len(dict):計算字典元素個數,即鍵的總數。
3、str(dict):輸出字典可列印的字元串表示。
4、type(variable):返回輸入的變數類型,如果變數是字典就返回字典類型。
Python字典包含了以下內置方法:
1、radiansdict.clear():刪除字典內所有元素
2、radiansdict.():返回一個字典的淺復制
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():以列表返回字典中的所有值
E. python 關於列表轉換成字典的問題
習慣用zip
>>> l1=[1,2,3]
>>> l2=['a','b','c']
>>> dict(zip(l1,l2))
{1: 'a', 2: 'b', 3: 'c'}
=======================
樓上的map(None,)在python3下已經失效了
===============
py3的map版
>>> dict(map(lambda x,y:[x,y], l1,l2))
{1: 'a', 2: 'b', 3: 'c'}
F. Python3的元組,字典,列表,集合有什麼聯系和區別
4個都是python的數據結構。
元組和列表的底層實現是一樣的,本質都是把一堆東西放在一排,區別在於元祖放完後就不能改了。
你把字典理解成我們普通用的字典就可以了,而集合就是把字典的所有value都設置成None。字典和集合的底層實現原理是一樣的,但初學者不必關注這個原理。集合與數學中的集合有相同性質,比如唯一性,對比字典中key的唯一性來理解一下。
比方:你遇到一個沒見過的字,查查看是不是標準的漢字,這就是集合的作用,集合只關注有沒有的問題;如果是標准漢字,你要看看這個字的意思,這就是字典的作用;你現在找來一個漢字,打算組成成語,然後再找幾個字,向第一個漢字左右放,就是列表的作用;一旦發現一個成語,就固定不變了,字和字的排列都不能改,這就是元祖。
G. python3列表根字典問題!
12345678910mobile=[['apple','ios','100','10'],['pear','android','200','20'],['apple','ios','500','50'],['pear','android','600','60']]mobiledict={}for elem in mobile: key=(elem[0],elem[1]) if key in mobiledict: mobiledict[key][0]+=int(elem[2]) mobiledict[key][1]+=int(elem[3]) else: mobiledict[key]=[int(elem[2]),int(elem[3])]print(mobiledict)
H. 在Python中,為什麼字典的鍵值不可以更改
要回答這個問題,首先明白一個概念:
哈希(Hash)
Hash,一般翻譯做"散列",也有直接音譯為"哈希"的,就是把任意長度的輸入(又叫做預映射, pre-image),通過散列演算法,變換成固定長度的輸出,該輸出就是散列值。這種轉換是一種壓縮映射,也就是,散列值的空間通常遠小於輸入的空間,不同的輸入可能會散列成相同的輸出,所以不可能從散列值來唯一的確定輸入值。簡單的說就是一種將任意長度的消息壓縮到某一固定長度的消息摘要的函數。
所有散列函數都有如下一個基本特性:如果兩個散列值是不相同的(根據同一函數),那麼這兩個散列值的原始輸入也是不相同的。這個特性是散列函數具有確定性的結果。但另一方面,散列函數的輸入和輸出不是一一對應的,如果兩個散列值相同,兩個輸入值很可能是相同的,但並不能絕對肯定二者一定相等。輸入一些數據計算出散列值,然後部分改變輸入值,一個具有強混淆特性的散列函數會產生一個完全不同的散列值。
回到字典key問題,python的dict的key必須是唯一的,所以,其必須是一個可哈希的值,才能保證得到唯一的內存地址。在python里,字元串,數字,元組都是不可變對象,也是可哈希的值。
I. python類中的字典,如何避免修改一個實例的字典,也修改了其他實例。
t = test 是類的拷貝操作, 有點像類指針
t2 = test() 是根據test類生成一個實例
可以參考如下情況進行對比:
mylist = [1,2,3,4]
list1 = mylist
list2 = mylist[:]
J. python 2.7 字典迭代期間改變字典成員個數的疑問
因為可迭代對象如果在迭代過程中長度發生了變化,就會引發 Runtime Error ,所以在 for k in some_dict: 這樣的語句中,是不可以使用 .pop() 或 .update() 方法的。
除非明確知道這次操作中不會增刪被迭代對象的元素,否則應該先把對象的 keys 拿出來放到另一個對象里(keys() 方法返回的列表),以避免上面的異常。
但在 Python3 中, keys() 不再返回列表,而是被迭代對象的 dict_keys 屬性,所以這招行不通了。可以考慮 list 轉換、待迭代結束後再 pop 或者使用字典推導式。