Object是一个解码的json对象,它包含一个名为items的列表。
obj = json.loads(response.body_as_unicode())
for index, item in enumerate(obj['items']):
if not item['name']:
obj['items'].pop(index)
我迭代这些项目,并希望在满足特定条件时删除项目。但是这没有按预期工作。经过一些研究后,我发现无法从列表中删除项目,同时在python中迭代此列表。但我无法将上述解决方案应用于我的问题。我尝试了一些不同的方法,比如
obj = json.loads(response.body_as_unicode())
items = obj['items'][:]
for index, item in enumerate(obj['items']):
if not item['name']:
obj['items'].remove(item)
但这会删除所有项目,而不仅仅是没有名称的项目。任何想法如何解决这个问题?
答案 0 :(得分:6)
迭代时不要从列表中删除项目;迭代将skip items,因为迭代索引未更新以考虑删除的元素。
相反,重建列表减去要删除的项目,list comprehension带有过滤器:
obj['items'] = [item for item in obj['items'] if item['name']]
或首先创建列表的副本以进行迭代,以便删除不会改变迭代:
for item in obj['items'][:]: # [:] creates a copy
if not item['name']:
obj['items'].remove(item)
您确实创建了一个副本,但是忽略了该副本,方法是循环显示您要从中删除的列表。
答案 1 :(得分:2)
使用while
循环并根据需要更改迭代器:
obj = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# remove all items that are smaller than 5
index = 0
# while index in range(len(obj)): improved according to comment
while index < len(obj):
if obj[index] < 5:
obj.pop(index)
# do not increase the index here
else:
index = index + 1
print obj
请注意,在for
循环中,无法更改迭代变量。它将始终设置为迭代范围中的下一个值。因此,问题不是enumerate
函数,而是for
循环。
将来请提供一个可验证的例子。在示例中使用json对象是不明智的,因为我们没有这个对象。