2017-09-07 51 views
1

我有以下词典示例列表。我想知道为什么下面的代码只会遍历列表中的两个值?为什么它不会遍历列表中的每个值?使用for循环删除列表中的词典

updated_list_of_site_dicts = [{'site': 'living', 'status': 'ready' }, {'site': 'keg', 'status': 'ready' }, {'site': 'box', 'status': 'ready' }, {'site': 'wine', 'status': 'ready' }] 

for site_dict in updated_list_of_site_dicts: 
    if site_dict['status'] == 'ready': 
     print site_dict['site'] + " is ready" 
     updated_list_of_site_dicts.remove(site_dict) 
     print updated_list_of_site_dicts 
+0

的可能的复制[为\ Python的_in循环打印列表中的最后一个项目(https://stackoverflow.com/questions/46086441/python-for-in-loop-to-print-the -last-item-in-the-list) –

+0

这也有帮助https://stackoverflow.com/questions/1207406/remove-items-from-a-list-while-iterating/1208792#1208792 – Hound

回答

1

使用列表理解来更新替代:

updated_list_of_site_dicts = [d for d in updated_list_of_site_dicts 
           if d['status'] != 'ready'] 

注意,在当前的例子,你把所有的“准备好”所以你会得到一个空列表。这里就是一个状态没有准备好一个例子:

updated_list_of_site_dicts = [{'site': 'living', 'status': 'ready' }, 
           {'site': 'keg', 'status': 'ready' }, 
           {'site': 'box', 'status': 'ready' }, 
           {'site': 'wine', 'status': 'NOT READY' }] 

for d in updated_list_of_site_dicts: 
    if d['status'] == 'ready': 
     print(d['site'] + " is ready") 
living is ready 
keg is ready 
box is ready 

updated_list_of_site_dicts = [d for d in updated_list_of_site_dicts 
           if d['status'] != 'ready'] 
print(updated_list_of_site_dicts) 
[{'site': 'wine', 'status': 'NOT READY'}] 
1

它循环只有两次因为remove()方法使列表索引转移。

如果你想循环列表和删除元素,你应该以相反的顺序迭代列表。如;

updated_list_of_site_dicts = [{'site': 'living', 'status': 'ready' }, {'site': 'keg', 'status': 'ready' }, {'site': 'box', 'status': 'ready' }, {'site': 'wine', 'status': 'ready' }] 

for i in range(len(updated_list_of_site_dicts) - 1, -1, -1): 
    site_dict = updated_list_of_site_dicts[i] 
    if site_dict['status'] == 'ready': 
     print site_dict['site'] + " is ready" 
     updated_list_of_site_dicts.remove(site_dict) 
     print updated_list_of_site_dicts 

此外,如果您只想删除元素,您也可以使用过滤器。

>>> updated_list_of_site_dicts = [{'site': 'living', 'status': 'ready' }, {'site': 'keg', 'status': 'ready' }, {'site': 'box', 'status': 'ready' }, {'site': 'wine', 'status': 'ready' }, {'site': 'can', 'status': 'not_ready' }] 
>>> updated_list_of_site_dicts = filter(lambda x: x['status'] != 'ready', updated_list_of_site_dicts) 
>>> updated_list_of_site_dicts 
[{'status': 'not_ready', 'site': 'can'}]