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:
some_list.remove(value)
, but it throws error if value is not found.some_list.pop(some_list[index])
, removes the item at the given position in the list, and return it.del (some_list[index])
, it removes element from the given index, it's different from pop as it doesn't return value.Scenarios:
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:
POP:
DEL:
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
So, now I hope you can decide what you need to choose for your needs.
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With