不改变原列表删除元素

83 投票
8 回答
90422 浏览
提问于 2025-04-18 15:06

假设你有一个列表

>>> m = ['a','b','c']

我想创建一个新的列表 n,这个列表里包含除了某个特定的项目 m 之外的所有东西(比如说这个项目是 'a')。但是,当我使用

>>> m.remove('a')
>>> m
m = ['b', 'c']

时,原来的列表会被改变(也就是说 'a' 从原来的列表中被删除了)。有没有办法可以得到一个新的列表,不包含 'a',而不改变原来的列表?我的意思是,m 仍然应该是 [ 'a', 'b', 'c' ],而我想得到一个 新的 列表,这个列表应该是 [ 'b', 'c' ]

8 个回答

2

我们可以在不使用内置的删除函数,也不创建新的列表变量的情况下来实现这个功能。

代码:

# 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)

输出结果

>>> ['b', 'c']
4

我们可以使用内置的 copy() 函数来复制列表;不过,复制的时候要给这个新复制的列表起个新名字。

m = ['a','b','c']
m_copy=m.copy()
m_copy.remove('a')

print (m)

['a', 'b', 'c']

print(m_copy)

['b', 'c']

8

如果顺序不重要,你可以使用集合(set),而且在集合中删除元素的速度似乎也很快:

list(set(m) - set(['a']))

不过,这样做会把你原来的列表中的重复元素去掉哦。

17

有一个简单的方法可以做到这一点,使用内置的函数:filter。

下面是一个例子:

a = [1, 2, 3, 4]
b = filter(lambda x: x != 3, a)
100

我猜你是想创建一个新的列表,里面不包含某个特定的元素,而不是直接修改原来的列表。一个方法是使用列表推导式:

m = ['a', 'b', 'c']
n = [x for x in m if x != 'a']

n 现在是 m 的一个副本,但里面没有 'a' 这个元素。

当然,另一种方法是先复制列表

m = ['a', 'b', 'c']
n = m[:]
n.remove('a')

如果是通过索引来移除某个值,那就更简单了

n = m[:index] + m[index+1:]

撰写回答