问题描述
如何删除不在列表中的大量词典项目?例如,有一个字典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 dct
是O(1)
,而查询k in lst
是O(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)中不存在的值的字典所需的输出。