总结了一些关于字典的小技巧或者注意的地方。

使用zip创建字典

创建字典有以下三种方法

dict(a=1, b=2, c=2)
dict([(a,1), (b,2), (c,3)])
dict({a:1, b:2, c:3})

推荐使用第二种方法结合zip创建

key = 'abcde'
value = range(1, 6)
dict(zip(key, value))

使用iteritems来遍历字典

d = dict(a=1, b=2, c=3)
for k, v in d.iteritems():
print k, v
# a 1
# c 3
# b 2

当然也可以使用items来遍历字典, 与之不同的是iteritems返回一个迭代器。

d = dict(a=1, b=2, c=3)
for k, v in d.items():
print k, v
# a 1
# c 3
# b 2
In [69]: d.iteritems()
Out[69]: <dictionary-itemiterator at 0x3f216d8> In [70]: d.items()
Out[70]: [('a', 1), ('c', 3), ('b', 2)]

使用get, pop来获取/删除key

首先,dict[key] 与 delete dict[key]也可以获取/删除key。但是key不存在时,会引发 KeyError 异常。为了避免引发异常可以使用get和带defaut参数的pop

  • get(key[, default])

    如果key在字典中,返回对应的value, 否则返回default。所以从来不会引发异常。
  • pop(key[, default])

    如果default未设置,则如果key不在字典中,删除key将引发异常。使用时加上default。

dict(dict1, **dict2)合并两个字典

合并两个字典可以先把两个字典分成key-value对,再连接两个key-value对,生成新的字典。即 dict(dict1.items()+dict2.items()) 。不过效率有些低。

使用效率更高的 dict(dict1, **dict2) 连接两个字典。

In [29]: dict1
Out[29]: {'a': 1, 'b': 2, 'c': 3} In [30]: dict2
Out[30]: {'d': 4, 'e': 5, 'f': 6} In [31]: dict(dict1, **dict2)
Out[31]: {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5, 'f': 6}
$ python -m timeit -s 'dict1=dict2=dict(a=1,b=2)' 'dict3=dict(dict1,**dict2)'
1000000 loops, best of 3: 0.573 usec per loop
$ python -m timeit -s 'dict1=dict2=dict(a=1,b=2)' 'dict3=dict(dict1.items()+dict2.items())'
100000 loops, best of 3: 2.21 usec per loop

谨慎使用dict.copy()

dict.copy()是一个浅拷贝,当遇到字典或者列表时,将不能完全拷贝。使用copy模块的deepcopy()方法。

import copy

dict1 = {'a': [1, 2], 'b': 3}
dict2 = dict1
dict3 = dict1.copy()
dict4 = copy.deepcopy(dict1) dict1['b'] = 'change'
dict1['a'].append('change') print dict1 # {'a': [1, 2, 'change'], 'b': 'change'}
print dict2 # {'a': [1, 2, 'change'], 'b': 'change'}
print dict3 # {'a': [1, 2, 'change'], 'b': 3}
print dict4 # {'a': [1, 2], 'b': 3}

最新文章

  1. linux进程
  2. (转)深入理解javascript连续赋值表达式
  3. PCL 库安装
  4. 延时Led灯
  5. HackerRank &quot;The Indian Job&quot;
  6. C# 按拼音/笔划 排序的简单示例(转)
  7. setResult()设置无效,onActivityResult没有被调用
  8. rsync 安装使用详解
  9. 毕向东udp学习笔记1
  10. 算法模板——sap网络最大流 1(非递归+邻接矩阵)
  11. mimtproxy和arpspoof实现局域网MITM
  12. Ubuntu一些常用的软件安装及配置
  13. SQL Queries and Multi-Org Architecture in Release 12
  14. Stream闪亮登场
  15. LeetCode专题-Python实现之第7题:Reverse Integer
  16. web前端学习笔记:文本属性
  17. Django RESTful Web Services, 此书学DRF不错
  18. Javascript常见性能优化
  19. Lua面向对象 --- 继承
  20. Javascript实用代码片段(译)

热门文章

  1. Javascript 常用
  2. unity读取Sqlite数据库
  3. js解决click事件点击事件间隔方法
  4. hdu 2222 Keywords Search ac自动机模板
  5. VS Code调试.NET Core
  6. Httpwatch 工具介绍
  7. linux搭建php
  8. sketch 跟随鼠标指针移动的特效
  9. 2016 Multi-University Training Contest 8 总结
  10. 原来ipad的浏览器也可以直接clip到evernote