Reputation: 1043
Assume you have a list
>>> m = ['a','b','c']
I'd like to make a new list n
that has everything except for a given item in m
(for example the item 'a'
). However, when I use
>>> m.remove('a')
>>> m
m = ['b', 'c']
the original list is mutated (the value 'a'
is removed from the original list). Is there a way to get a new list sans-'a'
without mutating the original? So I mean that m
should still be [ 'a', 'b', 'c' ]
, and I will get a new list, which has to be [ 'b', 'c' ]
.
Upvotes: 90
Views: 101517
Reputation: 11
The question is useful as I sometimes have a list that I use throughout my given script but I need to at a certain step to apply a logic on a subset of the list elements. In that case I found it useful to use the same list but only exclude the needed element for that individual step, without the need to create a totally new list with a different name. For this you can use either:
l=['a','b','c']
to exclude b, you can have [x for x in l if x!='b']
list(set(l) - set(['b']))
, pay attention here that you pass 'b'
as list ['b']
Upvotes: 0
Reputation: 82
We can do it via built-in copy() function for list; However, should assign a new name for the copy;
m = ['a','b','c']
m_copy=m.copy()
m_copy.remove('a')
print (m)
['a', 'b', 'c']
print(m_copy)
['b', 'c']
Upvotes: 4
Reputation: 1065
If the order is unimportant, you can use set (besides, the removal seems to be fast in sets):
list(set(m) - set(['a']))
This will remove duplicate elements from your original list though
Upvotes: 8
Reputation: 31
We can do it without using in built remove function and also without creating new list variable
Code:
# List m
m = ['a', 'b', 'c']
# Updated list m, without creating new list variable
m = [x for x in m if x != a]
print(m)
output
>>> ['b', 'c']
Upvotes: 3
Reputation: 1633
Another approach to list comprehension is numpy:
>>> import numpy
>>> a = [1, 2, 3, 4]
>>> list(numpy.remove(a, a.index(3)))
[1, 2, 4]
Upvotes: 1
Reputation: 3186
You can create a new list without the offending element with a list-comprehension. This will preserve the value of the original list.
l = ['a', 'b', 'c']
[s for s in l if s != 'a']
Upvotes: 1
Reputation: 1731
There is a simple way to do that using built-in function :filter .
Here is ax example:
a = [1, 2, 3, 4]
b = filter(lambda x: x != 3, a)
Upvotes: 19
Reputation: 32577
I assume you mean that you want to create a new list without a given element, instead of changing the original list. One way is to use a list comprehension:
m = ['a', 'b', 'c']
n = [x for x in m if x != 'a']
n
is now a copy of m
, but without the 'a'
element.
Another way would of course be to copy the list first
m = ['a', 'b', 'c']
n = m[:]
n.remove('a')
If removing a value by index, it is even simpler
n = m[:index] + m[index+1:]
Upvotes: 108