我有一个这样的名单:
lis = ['Date', 'Product', 'Price']
我想它比较:
dict = {'Date' : '2013-05-01', 'Salary' : '$5000', 'Product' : 'Toys', 'Price' : '$10', 'Salesman' : 'Smith'}
我想比较字典的键列表的每个项目,并作出新的解释。
我曾尝试是:
n = {}
for k,v in dict.items():
for i in lis:
if i==k:
n[k] = v
输出:
n = {'Date' : '2013-05-01', 'Product' : 'Toys', 'Price' : '$10'}
这工作,但我想通过发电机来做到这一点 - 有人可以帮助我做到这一点?
治疗lis
为一组,而不是,所以你可以使用字典视图和一个交叉点:
# python 2.7:
n = {k: d[k] for k in d.viewkeys() & set(lis)}
# python 3:
n = {k: d[k] for k in d.keys() & set(lis)}
或者你可以使用一个简单的字典理解in
对测试d
:
# python 2.6 or older:
n = dict((k, d[k]) for k in lis if k in d)
# python 2.7 and up:
n = {k: d[k] for k in lis if k in d}
这假设并不适用于所有值lis
是要在d
; 在if k in d
测试可以,如果他们总是会存在被丢弃。
为了您的具体情况,第二种形式是相当快了很多:
>>> from timeit import timeit
>>> timeit("{k: d[k] for k in d.viewkeys() & s}", 'from __main__ import d, lis; s=set(lis)')
2.156520128250122
>>> timeit("{k: d[k] for k in lis if k in d}", 'from __main__ import d, lis')
0.9401540756225586
filtered_dict = dict((k, original_dict[k]) for k in lis if k in original_dict)
或者,如果你有2.7+:
filtered_dict = {k: original_dict[k] for k in lis if k in original_dict}
如果你想使用一个发电机:
item_generator = ((k, original_dict[k]) for k in lis if k in original_dict)
该发电机将产生(key, value)
对。
文章来源: How to compare list values with dictionary keys and make a new dictionary of it using python