Remove element from list when using enumerate() in python

后端 未结 2 1233
慢半拍i
慢半拍i 2021-01-21 14:35

Object is a decoded json object that contains a list called items.

obj = json.loads(response.body_as_unicode())

for index, item in enumerate(obj[\'items\']):
         


        
相关标签:
2条回答
  • 2021-01-21 14:49

    Don't remove items from a list while iterating over it; iteration will skip items as the iteration index is not updated to account for elements removed.

    Instead, rebuild the list minus the items you want removed, with a list comprehension with a filter:

    obj['items'] = [item for item in obj['items'] if item['name']]
    

    or create a copy of the list first to iterate over, so that removing won't alter iteration:

    for item in obj['items'][:]:  # [:] creates a copy
       if not item['name']:
           obj['items'].remove(item)
    

    You did create a copy, but then ignored that copy by looping over the list that you are deleting from still.

    0 讨论(0)
  • 2021-01-21 15:10

    Use a while loop and change the iterator as you need it:

    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
    

    Note that in a for loop the iteration variable cannot be changed. It will always be set to the next value in the iteration range. Therefore the problem is not the enumerate function but the for loop.

    And in the future please provide a verifiable example. Using a json object in the example is not sensible because we do not have this object.

    0 讨论(0)
提交回复
热议问题