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.
Answer from James Sapam on Stack OverflowMy 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.
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
del or remove to delete an item from a list
How to delete all the items (in a list) beautifully?
Videos
Hi, I'm currently learning Python using, among others, automatetheboringstuff.com
It's a great resource, and I enjoy hacking through the projects.
I am now finishing Chapter 8 (https://automatetheboringstuff.com/chapter8/), and I'm doing the first project, "Create the Quiz File and Shuffle the Question Order".
In that project, at one point, we need to remove an item from a list. Said item's value is stored in a variable. I decided to use the .remove command, like this:
my_list = ['cat', 'dog', 'duck', 'rabbit'] item_to_be_removed = 'dog' my_list.remove(item_to_be_removed)
But the author uses instead the "del" command, such as:
del my_list[my_list.index(item_to_be_removed)]
My question: is there a difference ? It seems much easier to use the first method. I understand that "del" will delete an item using it's index number, and "remove" will remove the first instance of the value we want to delete. But in the context of the project, I don't see why del was chosen.
(Both "del" and ".remove" were explained in previous chapters of the book)