Python中两个字典(dict)合并
dict1={1:[1,11,111],2:[2,22,222]}
dict2={3:[3,33,333],4:[4,44,444]}
合并两个字典得到类似
{1:[1,11,111],2:[2,22,222],3:[3,33,333],4:[4,44,444]}
⽅法1:
dictMerged1=dict(dict1.items()+dict2.items())
⽅法2:
dictMerged2=dict(dict1, **dict2)
⽅法2等同于:
py()
dictMerged.update(dict2)
或者
dictMerged=dict(dict1)
dictMerged.update(dict2)
⽅法2⽐⽅法1速度快很多,⽤timeit测试如下
$ python -m timeit -s 'dict1=dict2=dict((i,i) for i in range(100))' 'dictMerged1=dict(dict1.items()+dict2.items())'
10000 loops, best of 3: 20.7 usec per loop
$ python -m timeit -s 'dict1=dict2=dict((i,i) for i in range(100))' 'dictMerged2=dict(dict1,**dict2)'
100000 loops, best of 3: 6.94 usec per loop
$ python -m timeit -s 'dict1=dict2=dict((i,i) for i in range(100))' 'dictMerged3=dict(dict1)' 'dictMerged3.update(dict2)'
100000 loops, best of 3: 7.09 usec per loop
$ python -m timeit -s 'dict1=dict2=dict((i,i) for i in range(100))' 'py()' 'dictMerged4.update(dict2)'
100000 loops, best of 3: 6.73 usec per loop
下⾯是字典合并的⼀个实例,调⽤update⽅法,dir1变,dir2不变,如下所⽰:
如果想dir1,dir2都不变,这时候可以借助⼀个中间变量dir3,如下所⽰:
在这⾥还要注意,把dir1的值赋给dir3时,要这样:dir3 = py(),不能这样:dir3 = dir1,否则dir3的改变会级联dir1的改变
原创作品,允许转载,转载时请务必以超链接形式标明⽂章 、作者信息和本声明。否则将追究法律责任。
⼀、字典介绍
字典(dictionary)是除列表意外python之中最灵活的内置数据结构类型。列表是有序的对象结合,字典
是⽆序的对象集合。两者之间的区别在于:字典当中的元素是通过键来存取的,⽽不是通过偏移存取。
1、字典的主要属性
*通过键⽽不是偏移量来读取
字典有时称为关联数组或者哈希表。它们通过键将⼀系列值联系起来,这样就可以使⽤键从字典中取出⼀项。如果列表⼀样可以使⽤索引操作从字典中获取内容。
*任意对象的⽆序集合
与列表不同,保存在字典中的项并没有特定的顺序。实际上,Python将各项从左到右随机排序,以便快速查。键提供了字典中项的象征性位置(⽽⾮物理性的)。
*可变,异构,任意嵌套
与列表相似,字典可以在原处增长或是缩短(⽆需⽣成⼀份拷贝),可以包含任何类型的对象,⽀持任意深度的嵌套,可以包含列表和其他字典等。
*属于可变映射类型
通过给索引赋值,字典可以在原处修改。但不⽀持⽤于字符串和列表中的序列操作。因为字典是⽆序集合,根据固定顺序进⾏操作是⾏不通的(例如合并和分⽚操作)。字典是唯⼀内置的映射类型(键映射到值得对象)。
*对象引⽤表(哈希表)
如果说列表是⽀持位置读取对象的引⽤数组,那么字典就是⽀持键读取⽆序对象的引⽤表。从本质上讲,字典是作为哈希表(⽀持快速检索的数据结构)来实现的。⼀开始很⼩,并根据要求⽽增长。此外,Python采⽤最优化的哈希算法来寻键,因此搜索是很快速的。和列表⼀样字典存储的是对象引⽤。
2、常见的字典操作
可以查看库⼿册或者运⾏dir(dict)或者help(dict),类型名为dict。当写成常量表达式时,字典以⼀系列"键:值(key:value)”对形式写出的,⽤逗号隔开,⽤⼤括号括起来。可以和列表和元组嵌套
操作                        解释
D1={}                        空字典
D={'one':1}                    增加数据
D1[key]='class'                    增加数据:已经存在就是修改,没有存在就是增加数据
D2={'name':'diege','age':18}            两项⽬字典
D3={'name':{'first':'diege','last':'wang'},'age':18} 嵌套
D2['name']                    以键进⾏索引计算
D3['name']['last']                字典嵌套字典的键索引
D['three'][0]                    字典嵌套列表的键索引
D['six'][1]                    字典嵌套元组的键索引
D2.has_key('name')                ⽅法:判断字典是否有name键
D2.keys()                    ⽅法:键列表
list(D)                        获取D这个字典的的KEY的 MS按字典顺序排序成⼀个列表
D2.values()                      ⽅法:值列表
'name' in D2                    ⽅法:成员测试:注意使⽤key来测试
<(key,deault)                ⽅法:默认 如果key存在就返回key的value,如果不存在就设置key的value为default。但是没有改变原对象的数据
D2.update(D1)                    ⽅法:合并。D1合并到D2,D1没有变化,D2变化。注意和字符串,列表好的合并操作”+“不同
D2.pop('age')                    ⽅法:删除 根据key删除,并返回删除的value
len(D2)                        ⽅法:求长(存储元素的数⽬)
D1[key]='class'                    ⽅法:增加:已经存在的数据就是修改,没有存在就是增加数据
D4=dict(name='diege',age=18)            其他构造技术
D5=dict.fromkeys(['a','b'])                其他构造技术 dict.fromkeys 可以从⼀个列表读取字典的key 值默认为空,可指定初始值.两个参数⼀个是KEY列表,⼀个初始值
>>> D4
{'a': None, 'b': None}
>>> D5=dict.fromkeys(['a','b','c'],0)
>>> D5
{'a': 0, 'c': 0, 'b': 0}
D6=dict(zip(keyslist.valslist))
>>> D={}
>>> D={'one':1}
>>> D
{'one': 1}
列表不能通过这样的⽅法来增加数据,列表只能通过append⽅法,列表之能通过L[1]='A'这样的⽅法来修改已存在序列的数据。
⼆、实际应⽤中的字典
1、字典的基本操作
1)、创建字典的⽅法 和修改
全部数据⼀起添加
>>> D={'name':'diege','age':18}
>>> D
{'age': 18, 'name': 'diege'}
>>> D={}
>>> D['name']='diege'
>>> D['age']=18
>>> D
{'age': 18, 'name': 'diege'}
>>> D1['age']=19
>>> D1
{'age': 19, 'name': 'diege'}
同样键不存在是新添加数据,键存在就是修改数据
>>> D1=dict(name='diege',age=18)
>>> D1
{'age': 18, 'name': 'diege'}
将数据按按key=value作为参数传递给dict()
dict(mapping) -> new dictionary initialized from a mapping object's (key, value) pairs >>> D=dict.fromkeys(['name','age'])
>>> D
{'age': None, 'name': None}
创建只有key没有value的字典。
>>> D=dict.fromkeys(['name','age'],0)
>>> D
{'age': 0, 'name': 0}
2)、索引
>>> D['age']
18
3)、取长
>>> len(D)
2
4)、键存在判断-参数使⽤key
>>> D.has_key('name')
True
5)、成员判断 使⽤key
>>> 'age' in D
True
6)、字典的键查看 返回键的列表
>>> D.keys()
['age', 'name']
7)、字典的值查看 返回值的列表
>>> D.values()
[18, 'diege']
8)、拷贝
2、原处修改字典
1)增加数据
>>> D['age']=18
>>> D
{'age': 18, 'name': 'diege'}
>>> D1['age']=19
>>> D1
{'age': 19, 'name': 'diege'}
同样键不存在是新添加数据,键存在就是修改数据
2)删除数据
根据键删除
pop⽅法是从字典中删除⼀个键并返回它的值
>>> D.pop('age')
18
⽅法是从字典中删除⼀个键并返回它的值
>>> del D['age']
18
18
从字典前⾯⼀对K:V的⽅式删除,并返回K,V合成的元组
>>> D3.popitem()
('age', 18)
清空字典所有数据
D1.clear()
3)合并数据
D2.update(D1)                    ⽅法:合并。D1合并到D2,D1没有变化,D2变化。注意和字符串,列表好的合并操作”+“不同
>>> D1
{'name': 'diege'}
>>> D2
{'class': 2, 'level': 2012}
>>> D2.update(D1)
python数组合并
>>> D1
{'name': 'diege'}
>>> D2
{'class': 2, 'name': 'diege', 'level': 2012}
3、其他字典⽅法
字典⽅法提供很多⼯具,例如 字典keys,valuse和items⽅法分别返回字典的键列表,值列表和(key,value)对元组
key列表
>>> D2.keys()
['class', 'name', 'level']
value列表
>>> D2.values()
[2, 'diege', 2012]
K,V元组的列表
>>> D2.items()
[('class', 2), ('name', 'diege'), ('level', 2012)]
>>> D2.viewkeys()
dict_keys(['class', 'name', 'level'])
>>> D2.viewvalues()
dict_values([2, 'diege', 2012])
>>> D2.viewitems()
dict_items([('class', 2), ('name', 'diege'), ('level', 2012)])
4、语⾔表
>>> table={'Python':'Guido',
... 'Perl':'Larry',
... 'Tcl':'John'}
for lang in table.keys():
...  print lang,'\t',table[lang]
...
Python  Guido
Tcl    John
Perl    Larry
因为字典并⾮序列,⽆法像字符串和列表那样直接通过⼀个for语句迭代他们。但如果要遍历字典的键列表很容易。调⽤字典的keys()⽅法,返回经过排序之后所有键的列表。再⽤for循环进⾏迭代。
实际上,Python也能然给你遍历字典的键的列表,⽽并不⽤在多数for循环中调⽤keys⽅法.就任何字典D⽽⾔,写成for key in D:和写成完整的for key in D.keys():效果是⼀样的
>>> for key in table:
...  print key
...
Python
Tcl
Perl
>>> for key in table.keys():
...  print key
...
Python
Tcl
Perl
>>> for key in table.values():
...  print key
...
Guido
John
Larry
三、字典⽤法注意事项
*序列运算⽆效。⽆法有序合并和分⽚
*对新索引赋值会增加项。
*键不⼀定总是字符串。任何不可变对象都可以(也就是不是列表)
1、使⽤字典模拟灵活的列表
当使⽤列表的时,对在列表末尾外的偏移赋值是⾮法的。
>>> L=[]
>>> L[99]='diege'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: list assignment index out of range
虽然可以使⽤重复预先分配⾜够的⼤的列表(例如 [0]*100)。但也可以使⽤字典来坐类似的事。这样就不需要这样的空间分配了。
使⽤整数键时,字典可以效仿列表再偏移赋值时增长
>>> [0]*100>>> L=[0]*100
>>> L[99]='diege
>>> D={}
>>> D[99]='diege'
>>> D[99]
'diege
这样的不⽤将来可能会⽤到的会被赋值的所有位置都分配空间。这样字典很像更具灵活性的列表。
2、字典⽤于稀疏数据结构
例如多维数组中只有少数位置上有存储的值
>>> M={}
>>> M[(2,3,4)]=88
>>> M[(7,8,9)]=99
>>> X=2;Y=3;Z=4
>>> M[(X,Y,Z)]
88
>>> M
{(2, 3, 4): 88, (7, 8, 9): 99}
这个数组中只有两个位置(2,3,4),(7,8,9)有值,其他位置都未空。键是元组,他们记录⾮空元素的坐标。我们并不是分配⼀个庞⼤⽽⼏乎为空的三维矩阵,⽽是使⽤⼀个简单的两个元素的字典。通过这⼀⽅式读取空元素的时,会触发键不存在的异常。因为这些元素实质上并没有被存储。
>>> M[(5,6,7)]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: (5, 6, 7)
3、避免missing-key错误
读取不存在的键的错误在稀疏矩阵中很常见。然⽽可能并不希望程序因为这⼀次错误⽽被关闭。这⾥有三种⽅式可以让我们填⼊默认值⽽不会出现这样
的错误提⽰,
1、)使⽤if语句预先对键进⾏测试。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。