假设我们有一个Python字典d,我们就像这样迭代它:
for k,v in d.iteritems():
del d[f(k)] # remove some item
d[g(k)] = v # add a new item
Run Code Online (Sandbox Code Playgroud)
(f并且g只是一些黑盒转换.)
换句话说,我们尝试添加/删除项目,d同时使用迭代它iteritems.
这个定义得很好吗?你能提供一些参考来支持你的答案吗?
(如果它被破坏了,如何解决这个问题非常明显,所以这不是我追求的角度.)
我有这段代码:
numbers = range(1, 50)
for i in numbers:
if i < 20:
numbers.remove(i)
print(numbers)
Run Code Online (Sandbox Code Playgroud)
但我得到的结果是:
[2,4,6,8,10,12,14,16,18,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35 ,36,37,38,39,40,41,42,43,44,45,46,47,48,49]
当然我希望结果中没有出现20以下的数字,我假设我在删除时做错了.
更新基于Lennart Regebro的回答
假设您遍历字典,有时需要删除元素.以下是非常有效的:
remove = []
for k, v in dict_.items():
if condition(k, v):
remove.append(k)
continue
# do other things you need to do in this loop
for k in remove:
del dict_[k]
Run Code Online (Sandbox Code Playgroud)
这里唯一的开销是构建要删除的键列表; 除非它与字典大小相比变大,否则不是问题.但是,这种方法需要一些额外的编码,所以它不是很受欢迎.
流行的词典理解方法:
dict_ = {k : v for k, v in dict_ if not condition(k, v)}
for k, v in dict_.items():
# do other things you need to do in this loop
Run Code Online (Sandbox Code Playgroud)
导致完整的字典副本,如果字典变大或经常调用包含函数,则存在愚蠢的性能损失的风险.
更好的方法是仅复制密钥而不是整个字典:
for k in list(dict_.keys()):
if condition(k, dict_[k]):
del dict_[k]
continue
# do …Run Code Online (Sandbox Code Playgroud) 我有一本字典dict2,我想通过它删除所有包含某些ID号的条目idlist. dict2[x]是一个列表列表(参见下面的示例dict2).这是我到目前为止编写的代码,但是它不会删除所有ID(entry[1])的实例idlist.有帮助吗?
dict2 = {G1:[[A, '123456', C, D], [A, '654321', C, D], [A, '456123', C, D], [A, '321654', C, D]]}
idlist = ['123456','456123','321654']
for x in dict2.keys():
for entry in dict2[x]:
if entry[1] in idlist:
dict2[x].remove(entry)
if dict2[x] == []:
del dict2[x]
Run Code Online (Sandbox Code Playgroud)
dict2 应该看起来像这样:
dict2 = {G1:[[A, '654321', C, D]]}
Run Code Online (Sandbox Code Playgroud) 得到标题中提到的错误。下面提到的函数由通过POST api调用的另一个函数调用。
错误位于打印语句下方的行上。不知道错误的含义以及为什么会出现。用于一周前运行的相同代码。
def remove_individual_stops(ordered_parkstop_dict, relevant_data):
new_ordered_parkstop_dict = ordered_parkstop_dict
for key, value in ordered_parkstop_dict.items():
if len(value) == 0:
for k,v in ordered_parkstop_dict.items():
if key in v:
new_ordered_parkstop_dict.pop(key)
print (type(ordered_parkstop_dict), ordered_parkstop_dict)
for k,v in ordered_parkstop_dict.items():
klist = []
keylist = []
if value and v:
if len(v)==1 and len(value)==1:
klist.append(k), keylist.append(key)
if (keylist == v) and (klist == value and len(value) == 1):
new_ordered_parkstop_dict.pop(key)
return new_ordered_parkstop_dict
Run Code Online (Sandbox Code Playgroud) 我在我的一个项目中使用kendoUI Grid。我使用他们的api检索了一段数据,发现它向json / dictionary添加了一些“不需要的”数据。将json传递回我的Pyramid后端后,我需要删除这些键。问题是,字典的深度可以是任意的,而我事先不知道深度。
例:
product = {
id: "PR_12"
name: "Blue shirt",
description: "Flowery shirt for boys above 2 years old",
_event: {<some unwanted data here>},
length: <some unwanted data>,
items: [{_event: {<some rubbish data>}, length: <more rubbish>, price: 23.30, quantity: 34, color: "Red", size: "Large"}, {_event: {<some more rubbish data>}, length: <even more rubbish>, price: 34.50, quantity: 20, color: "Blue", size: "Large"} ....]
}
Run Code Online (Sandbox Code Playgroud)
我要特别删除两个键:“ _ event”和“ length”。我尝试编写一个递归函数来删除数据,但似乎无法正确处理。有人可以帮忙吗?
这是我所拥有的:
def remove_specific_key(the_dict, rubbish):
for key in the_dict:
if key …Run Code Online (Sandbox Code Playgroud)