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

时间:2013-03-13 12:26:29

标签: python list dictionary generator

我有一个这样的清单:

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 :(得分:9)

lis视为一组,以便您可以使用dictionary views和交叉点:

# 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)}

或者你可以使用简单的字典理解与ind进行测试:

# 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

答案 1 :(得分: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)

生成器将产生(key, value)对。

答案 2 :(得分: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