Python关于使用dict的一些小技巧

上周组里的同事分享了一些Python中使用dict的技巧,有一些自己之前也不太了解,在此分享一下。

1.使用itervalues/iteritems

Python 2中,dict的keys、values、items等方法会复制一个列表并返回,对应的iterkeys、itervalues、iteritems函数返回的是迭代器。因此从效率上来看,当dict的内容很多时,用keys、values、items这些方法就会非常耗时,建议此时使用iterkeys、itervalues、iteritems这类方法。
但是,如果要在迭代过程中改变内容的话,应优先考虑使用不带iter的版本,另外要注意新添加的字典项是不会遍历到的。

2.不使用iterkeys

对字典迭代时,默认就是对它的key迭代,因此其实没有必要使用iterkeys(否则还要额外调用函数、生成迭代器,浪费时间)。
另外判断一个key是否在字典中,用if key in dict足以(O(1)复杂度),如果用if key in dict.iterkeys反而会有O(N)的复杂度,浪费时间。

3.关于get/pop的使用

引用或删除字典中的值,最快的方式还是d[key]/ del d[key]。d.get(key, default)/ d.pop(key, default)的速度要远远慢于前者。因此在确认这个key在字典中时,就应当使用d[key]/ del d[key],这相当于自带一次assert。
只有当前字典中可能没有这个key的时候,才用get/pop来获取(或者直接用in判断也可以)。

4.取字典中的一个元素

字典的key是不带顺序的,因此我们就取第一个元素。
比较简单的写法是这样:

v = d.values()[0]

这样会构建一个列表,比较浪费时间。其实最省的写法是这样的:

v = next(d.itervalues())  # 字典为空时报错
v = next(d.itervalues(), None)  # 字典为空时返回None

5.OrderedDict

dict是不带顺序的,如果想有顺序,就要用OrderedDict,dict有的功能它都有,dict没有的它也有,使用OrderedDict会根据放入元素的先后顺序进行排序。
假设有一个list,元素都是可哈希的,我想让对它去重可以转为set再转回list;如果还想保持顺序的话,就可以利用字典的fromkeys函数以及OrderedDict的有序性了:

from collections import OrderedDict
my_list = ['cat', 'dog', 'cat', 'mouse', 'dog', 'sheep', 'pig', 'pig', 'dog']
my_new_list = list(OrderedDict.fromkeys(my_list))
print my_new_list  # ['cat', 'dog', 'mouse', 'sheep', 'pig']

如果要按最后一次出现的顺序,可以这么写:

my_new_list2 = list(reversed(OrderedDict.fromkeys(reversed(my_list)))
print my_new_list2  # ['cat', 'mouse', 'sheep', 'pig', 'dog']
原文地址:https://www.cnblogs.com/wickedpriest/p/13836245.html