값으로 목록 요소를 삭제하는 간단한 방법이 있습니까?


942
a = [1, 2, 3, 4]
b = a.index(6)

del a[b]
print(a)

위의 오류는 다음과 같습니다.

Traceback (most recent call last):
  File "D:\zjm_code\a.py", line 6, in <module>
    b = a.index(6)
ValueError: list.index(x): x not in list

그래서 나는 이것을해야합니다 :

a = [1, 2, 3, 4]

try:
    b = a.index(6)
    del a[b]
except:
    pass

print(a)

그러나 이것을 수행하는 더 간단한 방법이 없습니까?


14
목록에서 색인 6을 계산합니다. 그러나 6이 목록에 없습니다 ... 무슨 일이 일어날까요? :)
Johannes Charra

5
코드가 del 문에 도달하지 않기 때문에 목록에서 값을 삭제하는 것과는 아무런 관련이 없습니다. 어쩌면 당신은 어떻게이 목록에없는 값의 인덱스를받을 수 있나요 "를하고 입양해야 명백한 대답을 -. 당신은 할 수 없습니다.
데이브 커비

57
@Dave 음, 실제로는 아닙니다. 존재 여부에 관계없이 목록에서 항목을 삭제하고 존재하지 않는 항목에 대한 색인을 얻지 않으려 고합니다. 질문은 잘 부탁드립니다.
ibz

요점을 제외 하고 except는 좋지 않은 연습 이다. except Exception최소한 사용하십시오 .
wjandrea

답변:


1564

목록에서 요소의 첫 항목을 제거하려면 list.remove다음을 사용하십시오 .

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

요소의 모든 항목을 제거하지는 않습니다. 이를 위해 목록 이해력을 사용하십시오.

>>> a = [10, 20, 30, 40, 20, 30, 40, 20, 70, 20]
>>> a = [x for x in a if x != 20]
>>> print(a)
[10, 30, 40, 30, 40, 70]

144
요소가 목록에 없으면 실패합니다. :)
ibz

21
요소가 목록에 없어도 @ibz 목록 이해가 실패하지 않습니까?
IsaacS

76
스키밍을하는 사람을 명확히하기 위해 ValueError 예외가 발생한다는 의미에서 "실패"합니다.
Casey Falk

10
목록 이해는 목록 참조를 변경하므로 참조 사본이 어딘가에 있으면 제거가 수행되지 않습니다.
Sebastien

removeO (n) 의 복잡성은 무엇입니까 ?
Rasmi Ranjan Nayak

184

일반적으로 파이썬은 할 수없는 일을하도록 지시하면 예외를 throw하므로 다음 중 하나를 수행해야합니다.

if c in a:
    a.remove(c)

또는:

try:
    a.remove(c)
except ValueError:
    pass

예외는 예상하고 올바르게 처리하는 한 반드시 나쁜 것은 아닙니다.


9
예방은 치료보다 낫습니다. 예외적 인 조건을 먼저 확인할 수 있다면 (예 : a)해야합니다.
Gusdor

82
다른 언어에서는 이것이 사실이지만, 파이썬에서는 "허가보다 용서를 구하는 것이 더 쉽다". docs.python.org/2/glossary.html#term-eafp
Dave Webb

6
@Gusdor : 목록이 스레드간에 공유 a.remove(c)되면 if c in a검사 에도 불구하고 어쨌든 실패 a할 수 있습니다 ( c in a체크 후 a.remove(c)호출 전에 다른 스레드에서 수정 될 수 있음 ). try/except또는 경쟁 조건을 피하기 위해 잠금 장치를 사용할 수 있습니다.
jfs

7
스레드간에 목록이 공유되고 중요한 섹션을 적용하지 않으면 @JFSebastian 더 큰 문제가 있습니다.
Gusdor

4
@Gusdor, Pythonique 관용구는 확인하지 않고 시도하고 예외가 발생하면 예외를 포착하는 것입니다. 조금 더 나쁘지만 더 효율적입니다 (2 개 대신 1 개만 조회)
Jeet

80

넌 할 수있어

a=[1,2,3,4]
if 6 in a:
    a.remove(6)

그러나 위의 목록에서 6을 2 번 검색해야하므로 제외하는 것이 더 빠릅니다.

try:
    a.remove(6)
except:
    pass

55

치다:

a = [1,2,2,3,4,5]

모든 발생을 없애기 위해 파이썬에서 필터 기능을 사용할 수 있습니다. 예를 들어 다음과 같습니다.

a = list(filter(lambda x: x!= 2, a))

따라서의 모든 요소를 ​​유지합니다 a != 2.

항목 중 하나를 꺼내려면

a.remove(2)

filter()다른 포장 을 list()합니까? 매뉴얼에 따르면 이미 목록을 반환합니다.
Olaf Dietsche

8
@OlafDietsche Python 3.x에서는 필터 객체 (2.x에서는 목록을 반환)를 반환하므로 "a"를 목록으로 캐스팅하여 기능을 수행해야합니다.
mathwizurd

17

다음은 목록 이해없이 수행하는 방법입니다.

def remove_all(seq, value):
    pos = 0
    for item in seq:
        if item != value:
           seq[pos] = item
           pos += 1
    del seq[pos:]

매우 영리합니다. 정말 마음에 들었습니다. 불행히도 가장 인기있는 답변만큼 비효율적 인 것 같습니다. 길의 솔루션은 실제로 제거하려는 가치가 거의없는 거대한 목록의 경우 훨씬 빠릅니다.
Larold

1
@Larold 가장 빠른 방법은 별도의 질문입니다. 내 돈은 일반적인 경우 목록 이해력에 있습니다. 이 솔루션은 입력 목록에서 값이 빈번하고 목록 이해가 사용되지 않으면 실제로 잘 수행되어야합니다. Cython에서 Pypy, numpy 데이터를 사용해보십시오. [ O(n*n)@Gill 의 답변은 불필요합니다 (1e6 및 1e12 비교 – 후자를 위험에 빠뜨리고 싶지 않음). CPython에서 while 1: L.remove(value)return ValueError은 소수 value또는 소수의 목록에서 잘 작동 할 수 있습니다 .
jfs

13

삭제할 값을 알고 있다면 간단한 방법이 있습니다 (어쨌든 생각할 수있는 것처럼 간단합니다).

a = [0, 1, 1, 0, 1, 2, 1, 3, 1, 4]
while a.count(1) > 0:
    a.remove(1)

당신은 얻을 것이다 [0, 0, 2, 3, 4]


4
while 1 in a:루프 구조로 사용하지 않겠습니까?
TerminalDilettante

12
이것은 O(n^2)이해력이있는 곳 O(n)입니다.
Mad Physicist

1
물론 @MadPhysicist가 옳으며, TerminalDilettante의 버전은 성능에 신경 쓰지 않아도 훨씬 더 비판적입니다. 2013 년은 방금 파이썬을 배우기 시작했으며 요즘에는 종종 내가 쓴 것을 부끄러워합니다.
gil

11

응용 프로그램에서 집합이 적용 가능한 경우 목록 대신 집합을 사용하는 것도 가능합니다.

데이터가 주문되지 않고 중복이 없으면 IE

my_set=set([3,4,2])
my_set.discard(1)

오류가 없습니다.

종종 목록은 실제로 정렬되지 않은 항목에 대한 편리한 컨테이너입니다. 목록에서 요소의 모든 발생을 제거하는 방법을 묻는 질문이 있습니다. 처음부터 속이기를 원하지 않으면 다시 한 번 세트가 편리합니다.

my_set.add(3)

위에서 my_set을 변경하지 않습니다.


10

다른 많은 답변에서 언급했듯이 list.remove()작동하지만 ValueError항목이 목록에 없으면 a를 던집니다 . python 3.4 이상에서는 suppressContextmanager를 사용하여 이것을 처리하는 흥미로운 접근법이 있습니다 .

from contextlib import suppress
with suppress(ValueError):
    a.remove('b')

8

목록에서 값을 찾아서 색인이있는 경우 삭제하는 것은 list의 remove 메소드를 사용하여 쉽게 수행 할 수 있습니다.

>>> a = [1, 2, 3, 4]
>>> try:
...   a.remove(6)
... except ValueError:
...   pass
... 
>>> print a
[1, 2, 3, 4]
>>> try:
...   a.remove(3)
... except ValueError:
...   pass
... 
>>> print a
[1, 2, 4]

이 작업을 자주 수행하면 함수로 묶을 수 있습니다.

def remove_if_exists(L, value):
  try:
    L.remove(value)
  except ValueError:
    pass

8

이 예제는 빠르며 목록에서 값의 모든 인스턴스를 삭제합니다.

a = [1,2,3,1,2,3,4]
while True:
    try:
        a.remove(3)
    except:
        break
print a
>>> [1, 2, 1, 2, 4]

2
이렇게하면 당신은 정말에만해야 breakexcept ValueError.
Anthon


7

요소가 다른 경우 간단한 설정 차이가 발생합니다.

c = [1,2,3,4,'x',8,6,7,'x',9,'x']
z = list(set(c) - set(['x']))
print z
[1, 2, 3, 4, 6, 7, 8, 9]

2
요소가 다르고 order를 신경 쓰지 않는 경우 .
Tom Zych

2

.pop을 사용할 수도 있습니다.

>>> lst = [23,34,54,45]
>>> remove_element = 23
>>> if remove_element in lst:
...     lst.pop(lst.index(remove_element))
... 
23
>>> lst
[34, 54, 45]
>>> 

2

제거하려는 요소를 제외한 모든 항목을 색인화하여 목록을 덮어 씁니다.

>>> s = [5,4,3,2,1]
>>> s[0:2] + s[3:]
[5, 4, 2, 1]

2

for 루프와 조건으로 :

def cleaner(seq, value):    
    temp = []                      
    for number in seq:
        if number != value:
            temp.append(number)
    return temp

그리고 당신이 전부는 아니지만 일부를 제거하려면 :

def cleaner(seq, value, occ):
    temp = []
    for number in seq:
        if number == value and occ:
            occ -= 1
            continue
        else:
            temp.append(number)
    return temp

1
 list1=[1,2,3,3,4,5,6,1,3,4,5]
 n=int(input('enter  number'))
 while n in list1:
    list1.remove(n)
 print(list1)

필터 기능을 사용하지 않고
Ravikiran D

1

예를 들어 x에서 1을 모두 제거하려고합니다. 이것이 내가 갈 방법입니다.

x = [1, 2, 3, 1, 2, 3]

이제 이것은 내 방법을 실제로 사용합니다.

def Function(List, Unwanted):
    [List.remove(Unwanted) for Item in range(List.count(Unwanted))]
    return List
x = Function(x, 1)
print(x)

그리고 이것은 한 줄로 내 방법입니다.

[x.remove(1) for Item in range(x.count(1))]
print(x)

둘 다 이것을 출력으로 산출합니다.

[2, 3, 2, 3, 2, 3]

도움이 되었기를 바랍니다. 추신. 탄원서에 따르면 이것은 버전 3.6.2로 작성되었으므로 이전 버전에 맞게 조정해야 할 수도 있습니다.


1

어쩌면 귀하의 솔루션은 int와 함께 작동하지만 사전으로는 작동하지 않습니다.

한편으로는 remove ()가 작동하지 않았습니다. 그러나 기본 유형과 작동 할 수 있습니다. 다음 코드는 객체 목록에서 항목을 제거하는 방법이기도합니다.

반면 'del'도 제대로 작동하지 않았습니다. 필자의 경우 python 3.6 사용 : 'del'명령을 사용하여 'for'bucle의 목록에서 요소를 삭제하려고하면 python이 프로세스의 색인을 변경하고 bucle이 시간 전에 조기에 중지됩니다. 요소별로 요소를 역순으로 삭제하는 경우에만 작동합니다 . 이런 식으로 보류중인 요소 배열 인덱스를 변경하지 않아도됩니다.

그런 다음 Im은 다음을 사용했습니다.

c = len(list)-1
for element in (reversed(list)):
    if condition(element):
        del list[c]
    c -= 1
print(list)

'list'는 [{ 'key1': value1 '}, {'key2 ': value2}, {'key3 ': value3}, ...]과 같습니다.

또한 enumerate를 사용하여 더 많은 pythonic을 수행 할 수 있습니다.

for i, element in enumerate(reversed(list)):
    if condition(element):
        del list[(i+1)*-1]
print(list)

0
arr = [1, 1, 3, 4, 5, 2, 4, 3]

# to remove first occurence of that element, suppose 3 in this example
arr.remove(3)

# to remove all occurences of that element, again suppose 3
# use something called list comprehension
new_arr = [element for element in arr if element!=3]

# if you want to delete a position use "pop" function, suppose 
# position 4 
# the pop function also returns a value
removed_element = arr.pop(4)

# u can also use "del" to delete a position
del arr[4]

0

이렇게하면 "-v"array에서 모든 인스턴스가 제거되고 인스턴스 sys.argv가 없으면 불평하지 않습니다.

while "-v" in sys.argv:
    sys.argv.remove('-v')

코드는 다음과 같은 파일에서 실제로 볼 수 있습니다 speechToText.py.

$ python speechToText.py -v
['speechToText.py']

$ python speechToText.py -x
['speechToText.py', '-x']

$ python speechToText.py -v -v
['speechToText.py']

$ python speechToText.py -v -v -x
['speechToText.py', '-x']

-1

이것은 단지 사용, 내 대답은 동안에 대한

def remove_all(data, value):
    i = j = 0
    while j < len(data):
        if data[j] == value:
            j += 1
            continue
        data[i] = data[j]
        i += 1
        j += 1
    for x in range(j - i):
        data.pop()
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.