如何用Python比较列表值与字典键并创建新字典

8 投票
3 回答
46430 浏览
提问于 2025-04-17 18:56

我有一个这样的列表:

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

这个方法可以用,但我想用生成器来实现——有没有人能帮我做到这一点?

相关问题:

3 个回答

0

适用于Python 3.6

dict_keys_list = list(dict.keys())
dict_keys_list.sort()
for key in dict_keys_list:
     if key in lis:
          print("Key is present")

还有一种方法是,你想把一组键和字典里的键进行比较,看它们是否相等。

person = { 'name' : 'Don', 'nickname' : 'John', 'age' : 45, 'salary' : 50000, 'place' : 'Monaco, Europe' }
compare_list = ['nickname', 'place', 'name', 'salary', 'age']
person_keys_list = list(person.keys())
person_keys_list.sort()
compare_list.sort()
person_keys_list == compare_list # Gives you True
1
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)

这个生成器会产生 (键, 值) 这样的配对。

15

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

撰写回答