MHS*_*MHS 2 python dictionary list generator
我有一个这样的列表:
lis = ['Date', 'Product', 'Price']
Run Code Online (Sandbox Code Playgroud)
我想比较一下:
dict = {'Date' : '2013-05-01', 'Salary' : '$5000', 'Product' : 'Toys', 'Price' : '$10', 'Salesman' : 'Smith'}
Run Code Online (Sandbox Code Playgroud)
我想比较每个列表项和字典键,并创建一个新字典.
我试过的是:
n = {}
for k,v in dict.items():
for i in lis:
if i==k:
n[k] = v
Run Code Online (Sandbox Code Playgroud)
输出:
n = {'Date' : '2013-05-01', 'Product' : 'Toys', 'Price' : '$10'}
Run Code Online (Sandbox Code Playgroud)
这有效,但我想通过发电机来做 - 有人可以帮助我这样做吗?
Mar*_*ers 11
对待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)}
Run Code Online (Sandbox Code Playgroud)
或者你可以使用一个简单的字典理解与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}
Run Code Online (Sandbox Code Playgroud)
这假设并非所有的价值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
Run Code Online (Sandbox Code Playgroud)