字典键与列表匹配;获取键值对

22
在Python中,我有一个元素列表'my_list'和一个字典'my_dict',其中一些键与'my_list'中的键匹配。
我想要搜索字典,并检索与'my_list'元素匹配的键/值对。
我尝试过这个...
    if any(x in my_dict for x in my_list):
          print set(my_list)&set(my_dict)

但它无法完成任务。


6
请不要将您的变量命名为 listdict。这会使人们感到困惑(如果您不小心,可能会混淆Python解释器)。 - Tim Pietzcker
6个回答

43

(我将list重命名为my_list,将dict重命名为my_dict以避免与类型名称冲突。)

为了更好的性能,您应该遍历列表并检查字典中是否存在:

for k in my_list:
    if k in my_dict:
        print(k, my_dict[k])

如果你想从这些键值对中创建一个新的字典,请使用

new_dict = {k: my_dict[k] for k in my_list if k in my_dict}

添加 my_dict.keys() 将使其更快,因为它只会在 dict 中搜索 keys。或者要搜索值,只需使用 my_dict.values() - Deepak Harish

16

不要使用dictlist作为变量名,因为它们会遮蔽内置函数。假设列表为l,字典为d

kv = [(k, d[k]) for k in l if k in d]

13
 new_dict = dict((k, v) for k, v in dict.iteritems() if k in list)

将列表转换为集合 set(list) 可能会 显著提高速度。


2
请注意,if k in list 的复杂度是 O(n) - Felix Kling
是的;为了简单起见,我方便地忽略了那个。 - Rob Cowie
1
hehe; 我失去了一个赞成票。看起来有点严厉;_刻意地_提供简单的答案回答简单的问题是有价值的。 - Rob Cowie
1
Rob:关键是高效的解决方案同样简单。 - Sven Marnach
在这种情况下,我同意,它几乎是一样简单的。这有点取决于OP问题的上下文,但鉴于细节的匮乏,我认为我的答案应该被忽略 :) - Rob Cowie
显示剩余2条评论

4

试试这个:

mydict = {'one': 1, 'two': 2, 'three': 3}
mykeys = ['three', 'one','ten']
newList={k:mydict[k] for k in mykeys if k in mydict}
print newList
{'three': 3, 'one': 1}

3

关于 print([kv for kv in dict.items() if kv[0] in list]),您有什么想法呢?


1
这是一个关于编程的一行解决方案。
{i:my_dict[i] for i in set(my_dict.keys()).intersection(set(my_list))}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接