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 或者使用字典推导式。