如何使用字典删除字典项如果它们的键不在列表中

问题描述

如何删除不在列表中的大量词典项目?例如,有一个字典dct一个列表`lst:

dct = {'a' : 2,'b' : 4,'c' : 6,'d' : 7}
lst = ['a','c']

最有效的方法过滤字典以使其产生结果:

dct.items()

输出

dict_items([('a',2),('c',6)])

谢谢!

解决方法

是对要求进行了改动,还是对现有的字典进行了修改?

如果您可以生成一个新的字典,则问题的措词可能会将您引向Python的filter函数,您可以按照以下方式实现(假设df[colnum] <- lapply(df[colnum],function(x) as.numeric(unlist(x))) 是要保留的键值的列表) :

key_list

您还可以通过以下方式对字典进行理解:

 new_dict = filter(lambda pair: pair[0] in key_list,old_dict)

如果绝对要肯定要对原始词典进行变异,那么有多种方法可以在Python的一行中完成此操作,但是对于Python程序员而言,它们并不是完全清楚的,所以我可能会循环执行:>

 new_dict = { key : value for (key,value) in old_dict if key in key_list }

这在Python 2中有效,但在Python 3中无效,因为for循环内的删除会中断迭代。对于Python 3(我认为),您需要执行以下操作:

for key in old_dict:
     if key not in key_list:
          del old_dict[key]
,

获取新字典的最简单方法是遍历列表,而不是字典:

new_dict = {k: dct[k] for k in lst if k in dct}

请注意,这是键上的O(N),而不是键和字典上的O(M * N)。查询k in dctO(1),而查询k in lstO(N)。假设列表比字典短,那么如果您高效地执行操作,则比遍历字典要好,因为那是O(M) > O(N)

如果保证您的列表中包含字典元素的子集,则可以完全跳过检查if k in dct

如果必须就地处理原始词典,则可以执行以下两项操作之一。较简单的解决方案是使用新字典:

new_dict = {k: dct[k] for k in lst if k in dct}
dct.clear()
dct.upate(new_dict)

如果那是作弊,则可以遍历字典。为了快速查找,请先将列表变成一组:

s = set(lst)
for k in list(dct.keys()):
    if k not in lst:
        del dct[k]
,

这是一种方法:

dct = {'a' : 2,'b' : 4,'c' : 6,'d' : 7}
lst = ['b','d']
ndct = {}
for l in list(dct):
    if l in lst:
        pass
    else:
        ndct[l] = dct[l]

ndct等于:

{'a': 2,'c': 6}
,

一个简单的代码:

p=(:TweetLeaf)--()

结果:

dct = {'a' : 2,'d']

for key in list(dct):
    if key in lst:
        dct.pop(key)

正如Mark Byers所说,必须使用{'a': 2,'c': 6} 函数来获取键的副本,否则,将发生“ RuntimeError:字典在迭代过程中更改大小”的错误。适用于python版本2和3。

,

您可以找到字典键和列表值之间的交集:

dct = {'a' : 2,'d' : 7}
lst = ['a','c']

{k: dct[k] for k in dct.keys() & lst}

输出:

{'c': 6,'a': 2}
,

您可以使用要从字典中删除的单词列表,如果列表中不存在该键,则可以打印字典。 代码如下:

dct = {key:val键,如果键不在lst中,则val在dct.items()中}

只需打印dct.items(),您将得到想要的结果

您将获得仅重置列表(lst)中不存在的值的字典所需的输出。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...