Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Best way to remove elements from a list

Tags:

I would like to know what is the best way/efficient way to remove element(s) from the list.

There are few functions provided by Python:

  1. some_list.remove(value), but it throws error if value is not found.
  2. some_list.pop(some_list[index]), removes the item at the given position in the list, and return it.
  3. del (some_list[index]), it removes element from the given index, it's different from pop as it doesn't return value.

Scenarios:

  • If you have few items to remove say one element or between 1 to 5.
  • If you have to remove multiple items in a sequence.
  • If you have to remove different items based on a condition.
  • How about if you have a list of lists and want to remove elements in sequence.
like image 284
user3247054 Avatar asked Feb 02 '14 11:02

user3247054


2 Answers

My answer is not exactly to your question but after you read this, I hope you can decide which type you need to choose for your needs.

Python’s lists are variable-length arrays, not Lisp-style linked lists. The implementation uses a contiguous array of references to other objects, and keeps a pointer to this array.

This makes indexing a list a[i] an operation whose cost is independent of the size of the list or the value of the index.

When items are appended or inserted, the array of references is resized. Some algorithm is applied to improve the performance of appending items repeatedly; when the array must be grown, some extra space is allocated so the next few times don’t require an actual resize i.e over-allocation. More Information

Removing vs Pop vs Delete:

At first glance it looks like all of them are doing the same thing.

Under the hood its behaving different.

removing : remove an element from the list by iterating from 0 index till the first match of the element is found. taking more time to iterate if the element is at the end.

pop : removing element from the list by using the index. taking less time.

del : is a python statement that removes a name from a namespace, or an item from a dictionary, or an item from a list by using the index.

REMOVE:

  • it removes the first occurence of value.
  • raises ValueError if the value is not present.
  • it takes only one argument, so you can't remove multiple value in one shot.

POP:

  • remove and return item at index (default last).
  • Raises IndexError if list is empty or index is out of range.
  • it takes only one argument, so you can't remove multiple value in one shot.

DEL:

  • remove the item at index and return nothing.
  • it can remove slices from a list or can clear the whole list.

Benchmark:

Worst case : deleting from the end of the list.

yopy:-> python -m timeit "x=range(1000)" "x.pop(999)" 100000 loops, best of 3: 10 usec per loop yopy:-> python -m timeit "x=range(1000)" "x.remove(999)" 10000 loops, best of 3: 31.3 usec per loop yopy:-> python -m timeit "x=range(1000)" "del x[999]" 100000 loops, best of 3: 9.86 usec per loop yopy:-> 

Best case: begining of the list.

yopy:-> python -m timeit "x=range(1000)" "x.remove(1)" 100000 loops, best of 3: 10.3 usec per loop yopy:-> python -m timeit "x=range(1000)" "x.pop(1)" 100000 loops, best of 3: 10.4 usec per loop yopy:-> python -m timeit "x=range(1000)" "del x[1]" 100000 loops, best of 3: 10.4 usec per loop yopy:-> 

Point to be noted:

if array grows or shrinks in the middle

  • Realloc still depends on total length.
  • But, All the trailing elements have to be copied

So, now I hope you can decide what you need to choose for your needs.

like image 83
James Avatar answered Oct 07 '22 02:10

James


Use a list comprehension:

Scenario 1:

[item for item in my_list if 1 <= item <=5 ] 

Scenario 2:

to_be_removed = {'a', '1', 2} [item for item in my_list if item not in to_be_removed ] 

Scenario 3:

[item for item in my_list if some_condition()] 

Scenario 4(Nested list comprehension):

[[item for item in seq if some_condition] for seq in my_list] 

Note that if you want to remove just one item then list.remove, list.pop and del are definitely going to be very fast, but using these methods while iterating over the the list can result in unexpected output.

Related: Loop “Forgets” to Remove Some Items

like image 33
Ashwini Chaudhary Avatar answered Oct 07 '22 04:10

Ashwini Chaudhary