如何列表值与字典键比较并做它的一个新的字典使用python(How to compare list

2019-07-21 11:44发布

我有一个这样的名单:

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'}

这工作,但我想通过发电机来做到这一点 - 有人可以帮助我做到这一点?

Answer 1:

治疗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


Answer 2:

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