development

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

big-blog 2020. 9. 28. 09:31
반응형

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


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

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


목록에서 요소의 첫 번째 항목을 제거하려면 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]

보통 파이썬은 할 수없는 일을하도록 지시하면 예외를 던질 것이므로 다음 중 하나를 수행해야합니다.

if c in a:
    a.remove(c)

또는:

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

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


넌 할 수있어

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

그러나 위의 목록에서 6을 2 번 검색해야하므로 예외가 더 빠를 것입니다.

try:
    a.remove(6)
except:
    pass

중히 여기다:

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

모든 발생을 제거하려면 파이썬에서 필터 함수를 사용할 수 있습니다. 예를 들어 다음과 같습니다.

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

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

항목 중 하나를 꺼내려면

a.remove(2)

목록 이해없이 제자리에서 수행하는 방법은 다음과 같습니다.

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

삭제할 값을 아는 경우 다음과 같은 간단한 방법이 있습니다 (어쨌든 제가 생각할 수있는 간단한 방법).

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

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


또 다른 가능성은 세트가 애플리케이션에 적용되는 경우 목록 대신 세트를 사용하는 것입니다.

IE는 데이터가 주문되지 않았고 중복이없는 경우

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

오류가 없습니다.

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

my_set.add(3)

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


다른 많은 답변에서 언급했듯이 list.remove()작동하지만 ValueError항목이 목록에 없으면 던집니다 . 파이썬 3.4 이상으로, 사용이 처리에 대한 흥미로운 접근있을 억제 contextmanager는 :

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

목록에서 값을 찾은 다음 해당 인덱스 (존재하는 경우)를 삭제하는 것은 목록의 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

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

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

요소가 구별되는 경우 간단한 집합 차이가 적용됩니다.

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]

한 줄로 :

a.remove('b') if 'b' in a else None

때로는 유용합니다.

더 쉽게 :

if 'b' in a: a.remove('b')

.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]
>>> 

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

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

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

 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)

Say for example, we want to remove all 1's from x. This is how I would go about it:

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

Now, this is a practical use of my method:

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

And this is my method in a single line:

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

Both yield this as an output:

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

Hope this helps. PS, pleas note that this was written in version 3.6.2, so you might need to adjust it for older versions.


Maybe your solutions works with ints, but It Doesnt work for me with dictionarys.

In one hand, remove() has not worked for me. But maybe it works with basic Types. I guess the code bellow is also the way to remove items from objects list.

In the other hand, 'del' has not worked properly either. In my case, using python 3.6: when I try to delete an element from a list in a 'for' bucle with 'del' command, python changes the index in the process and bucle stops prematurely before time. It only works if You delete element by element in reversed order. In this way you dont change the pending elements array index when you are going through it

Then, Im used:

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

where 'list' is like [{'key1':value1'},{'key2':value2}, {'key3':value3}, ...]

Also You can do more pythonic using enumerate:

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

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]

This removes all instances of "-v" from the array sys.argv, and does not complain if no instances were found:

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

You can see the code in action, in a file called 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']

this is my answer, just use while and for

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

syntax: lst.remove(x)

lst = ['one', 'two', 'three', 'four', 'two']

lst.remove('two') #it will remove first occurence of 'two' in a given list

del lst[2] #delete item by index value

print(lst)

Yes. This is what I found to be most useful:

import sys

a = [1, 2, 3, 4]

y = 0

if y < 1:
      a.remove(1)
      print len(a)
else:
    sys.exit()

Now .remove() only takes one argument, so you can only remove one integer from your list.

참고URL : https://stackoverflow.com/questions/2793324/is-there-a-simple-way-to-delete-a-list-element-by-value

반응형