【问题标题】:How to compare list values with dictionary keys and make a new dictionary of it using python如何将列表值与字典键进行比较并使用python创建一个新字典
【发布时间】:2013-03-01 09:17:59
【问题描述】:

我有一个这样的列表:

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

这可行,但我想通过生成器来做 - 有人可以帮我做吗?

【问题讨论】:

  • 不要调用你的dictdict,它会影响Python中的dict,请改用d

标签: python list dictionary generator


【解决方案1】:

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

或者您可以使用简单的 dict 理解和 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

【讨论】:

  • {k: d[k] for k in list if k in d} 不会比{k: v for k, v in d.items() if k in lis} 更有效率吗?这样in 检查总是针对字典(摊销O(1))而不是列表(O(n))
  • 很好的解决方案——不过请注意,这在调试期间不起作用。如果您像我刚才那样拔头发,请知道此解决方案在 3.6 中是正确的。 Heres 一张票,解释 dict 理解和调试发生了什么。
  • @JamieMarshall 那是因为你不能在现有的本地范围内创建新的闭包。您必须先设置全局变量,或者将推导式包装在一个新范围内(如 lambda)。
【解决方案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) 对。

【讨论】:

    【解决方案3】:

    对于 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多