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


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
이렇게하면 당신은 정말에만해야 break에 except 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.