[python] 목록에서 모든 값을 제거 하시겠습니까?

파이썬에서는 remove()목록에서 처음 나타나는 값을 제거합니다.

목록에서 모든 값 을 제거하는 방법은 무엇입니까?

이것이 내가 생각한 것입니다.

>>> remove_values_from_list([1, 2, 3, 4, 2, 2, 3], 2)
[1, 3, 4, 3]



답변

기능적 접근 :

파이썬 3.x

>>> x = [1,2,3,2,2,2,3,4]
>>> list(filter((2).__ne__, x))
[1, 3, 3, 4]

또는

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

파이썬 2.x

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


답변

목록 이해를 사용할 수 있습니다.

def remove_values_from_list(the_list, val):
   return [value for value in the_list if value != val]

x = [1, 2, 3, 4, 2, 2, 3]
x = remove_values_from_list(x, 2)
print x
# [1, 3, 4, 3]


답변

효율적인 목록 이해 (또는 생성기 표현식)를 사용하면서 원래 목록을 수정해야하는 경우 슬라이스 할당을 사용할 수 있습니다.

>>> x = [1, 2, 3, 4, 2, 2, 3]
>>> x[:] = (value for value in x if value != 2)
>>> x
[1, 3, 4, 3]


답변

보다 추상적 인 방식으로 첫 번째 게시물의 솔루션을 반복합니다.

>>> x = [1, 2, 3, 4, 2, 2, 3]
>>> while 2 in x: x.remove(2)
>>> x
[1, 3, 4, 3]


답변

간단한 해결책을보십시오

>>> [i for i in x if i != 2]

이것은 x없는 모든 요소가있는 목록을 반환합니다2


답변

위의 모든 답변 (Martin Andersson의 경우 제외)은 원래 목록에서 항목을 제거하지 않고 원하는 항목없이 새 목록을 만듭니다.

>>> import random, timeit
>>> a = list(range(5)) * 1000
>>> random.shuffle(a)

>>> b = a
>>> print(b is a)
True

>>> b = [x for x in b if x != 0]
>>> print(b is a)
False
>>> b.count(0)
0
>>> a.count(0)
1000

>>> b = a
>>> b = filter(lambda a: a != 2, x)
>>> print(b is a)
False

목록에 대한 다른 참조가 있으면 중요 할 수 있습니다.

목록을 제자리에 수정하려면 다음과 같은 방법을 사용하십시오

>>> def removeall_inplace(x, l):
...     for _ in xrange(l.count(x)):
...         l.remove(x)
...
>>> removeall_inplace(0, b)
>>> b is a
True
>>> a.count(0)
0

속도와 관련하여 랩톱의 결과는 모두 1000 개의 항목이 제거 된 5000 개의 항목 목록에 있습니다.

  • 목록 이해-~ 400us
  • 필터-~ 900us
  • .remove () 루프-50ms

따라서 .remove 루프는 약 100 배 더 느립니다. …… 흠, 다른 접근법이 필요할 수 있습니다. 내가 찾은 가장 빠른 것은 목록 이해를 사용하는 것이지만 원래 목록의 내용을 바꿉니다.

>>> def removeall_replace(x, l):
....    t = [y for y in l if y != x]
....    del l[:]
....    l.extend(t)
  • removeall_replace ()-450us

답변

당신은 이것을 할 수 있습니다

while 2 in x:
    x.remove(2)