删除没有变异的列表元素

use*_*749 23 python list

假设你有一个清单

>>> m = ['a','b','c']
Run Code Online (Sandbox Code Playgroud)

我想创建一个新列表n,除了给定项目之外的所有内容m(例如项目'a').但是,当我使用时

>>> m.remove('a')
>>> m
m = ['b', 'c']
Run Code Online (Sandbox Code Playgroud)

原始列表被突变(该值'a'从原始列表中删除).有没有办法获得一个新的名单sans- 'a'没有改变原来的?所以我的意思是,它m应该仍然是[ 'a', 'b', 'c' ],我将得到一个新的清单,必须是[ 'b', 'c' ].

Kru*_*lur 32

我假设您的意思是要创建一个没有给定元素的新列表,而不是更改原始列表.一种方法是使用列表理解:

m = ['a', 'b', 'c']
n = [x for x in m if x != 'a']
Run Code Online (Sandbox Code Playgroud)

n现在是副本m,但没有'a'元素.

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

m = ['a', 'b', 'c']
n = m[:]
n.remove('a')
Run Code Online (Sandbox Code Playgroud)

如果通过索引删除值,则更简单

n = m[:index] + m[index+1:]
Run Code Online (Sandbox Code Playgroud)

  • 在这个特定的例子中,我觉得值得一提的是,如果你想要一个列表的副本,除了第0个元素,你可以用`m [1:]`来切片. (2认同)
  • 是的,但我读了这个问题,因为需要按值而不是按索引删除元素。不过,这是一个好点! (2认同)
  • 我想补充一点,如果该值在列表中不是唯一的,则第一种和第二种方法具有不同的行为。第一个会删除所有出现的值,而第二个只会删除第一次出现。 (2认同)

请叫我*_*小马哥 9

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

这是斧头的例子:

a = [1, 2, 3, 4]
b = filter(lambda x: x != 3, a)
Run Code Online (Sandbox Code Playgroud)


Ole*_*g O 8

如果顺序不重要,可以使用 set (此外,在集合中删除似乎很快):

list(set(m) - set(['a']))
Run Code Online (Sandbox Code Playgroud)

这将从原始列表中删除重复的元素