【问题标题】:Removing dictionaries from list with for loop使用 for 循环从列表中删除字典
【发布时间】:2018-02-16 13:47:36
【问题描述】:

我在下面有这个示例字典列表。我想知道为什么下面的代码只会遍历列表中的两个值?为什么它不遍历列表中的每个值?

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

【问题讨论】:

标签: python list dictionary


【解决方案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'}]

【讨论】:

    【解决方案2】:

    它只循环两次,因为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'}]
    

    【讨论】:

      猜你喜欢
      • 2014-06-28
      • 2017-04-05
      • 2022-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-06
      相关资源
      最近更新 更多