如何将列表值与字典键进行比较,并使用python创建一个新的字典

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)