스택큐힙리스트

만약 리스트에 항목이 존재한다면 그 항목을 삭제하는 방법은 무엇인가요? 본문

카테고리 없음

만약 리스트에 항목이 존재한다면 그 항목을 삭제하는 방법은 무엇인가요?

스택큐힙리스트 2023. 4. 23. 10:01
반응형

양식 텍스트 필드에서 new_tag 을 가져오고, 체크박스 필드에서 self.response.get(new_tag) 와 selected_tags 을 가져오고 있습니다.

self.response.get_all(selected_tags)

제가 이들을 이렇게 결합합니다:

tag_string = new_tag

new_tag_list = f1.striplist(tag_string.split(,) + selected_tags)

( f1.striplist 는 리스트 내 문자열에서 공백을 제거하는 함수입니다.)

하지만 만약 tag_list 가 비어있을 경우 (새 태그가 입력되지 않은 경우) 하지만 일부 selected_tags 가 존재할 경우, new_tag_list 는 빈 문자열 를 포함합니다.

예를 들어, logging.info에서:

new_tag

selected_tags[u'Hello', u'Cool', u'Glam']

new_tag_list[u'', u'Hello', u'Cool', u'Glam']

빈 문자열을 어떻게 제거할 수 있나요?

리스트에 빈 문자열이 있다면:

>>> s = [u'', u'Hello', u'Cool', u'Glam']

>>> i = s.index()

>>> del s[i]

>>> s

[u'Hello', u'Cool', u'Glam']

하지만 빈 문자열이 없다면:

>>> s = [u'Hello', u'Cool', u'Glam']

>>> if s.index():

i = s.index()

del s[i]

else:

print new_tag_list has no empty string

하지만 이것은 준다:

Traceback (most recent call last):

File , line 1, in

if new_tag_list.index():

ValueError: list.index(x): x not in list

이게 왜 일어나는거지? 그리고 어떻게 해결할 수 있을까?

답변 1

거의 영어식:

in 연산자를 사용하여 존재 여부를 테스트 한 다음 remove 방법을 적용하십시오.

if thing in some_list: some_list.remove(thing)

if 대신에 while를 사용하면 모든 발생을 제거하기 위해 thing 방법은 첫 번째 발생만 제거합니다.

while thing in some_list: some_list.remove(thing)

간단하게 말해서, 작은 목록에는 아마도 내 선택입니다 (한 줄짜리 것에는 저항할 수 없습니다)

2) Duck-typed , EAFP 스타일:

이 선제계약-후문의 집단은 파이썬에서 흔합니다. 객체가 적합한지 미리 테스트하는 대신, 작업을 수행하고 관련 예외를 잡습니다.

try:

some_list.remove(thing)

except ValueError:

pass # or scream: thing not in some_list!

except AttributeError:

call_security(some_list not quacking like a list!)

물론, 위의 예제에서 두 번째 예외 절은 유머적으로 의문이 있을뿐 아니라 완전히 불필요합니다 (개념에 익숙하지 않은 사람들에게 덕 타이핑을 설명하기 위한 것이 목적이었습니다).

만약 여러 가지의 발생을 기대한다면:

while True:

try:

some_list.remove(thing)

except ValueError:

break

이 사용 사례에는 약간 verbose하지만, Python에서 매우 관용적입니다.

이것은 1위보다 더 잘 수행됩니다.

PEP 463은(는) 여기에서 유용할 수 있는 try/except 간단한 사용을위한 더 짧은 구문을 제안했지만 승인되지 않았습니다.

그러나, 파이썬 3.4에서 도입된 contextlib's suppress() contextmanager로 인해, 위의 코드를 다음과 같이 단순하게 만들 수 있습니다:

with suppress(ValueError, AttributeError):

some_list.remove(thing)

다시 말하지만, 여러 개의 일이 발생할 것으로 예상된다면:

with suppress(ValueError):

while True:

some_list.remove(thing)

3) 기능적인 스타일:

약 1993년, 파이썬은 lambda, reduce(), filter() 및 map(), 누락된 패치를 제출한 해커로 인해 수신하게 되었습니다*. 리스트에서 요소를 제거하는 데는 filter 을 사용할 수 있습니다.

is_not_thing = lambda x: x is not thing

cleaned_list = filter(is_not_thing, some_list)

당신의 경우에 유용할 수있는 바로 가기가 있습니다 : 만약 bool(item) == False 와 같이 None , 0, 빈 문자열 또는 다른 빈 컬렉션을 포함하는 항목을 필터링하려는 경우 첫 번째 인수로 None을 전달할 수 있습니다.

cleaned_list = filter(None, some_list)

[업데이트]: 파이썬 2.x에서 filter(function, iterable) 는 이제 (item for item in iterable if function(item)) 와 동일하지만 (첫 번째 인수가 None 인 경우 [item for item in iterable if item] 와 동일함), 이전에 filter는 리스트를 반환했지만 이제 제너레이터 표현식과 같이 작동합니다. 이것은 정리된 목록을 반복하고 폐기하는 경우에는 괜찮지만, 실제로 목록이 필요한 경우 list() 생성자로 filter() 호출을 둘러싸야합니다.

* 이러한 Lisp 풍미의 구조물은 Python에서는 조금 낯설게 여겨집니다. 약 2005년에는 Guido was even talking about dropping filter 와 함께 map 및 reduce 과 같은 동료들이 있었지만 이들은 아직 사라지지 않았으며 reduce 는 functools 모듈로 이동되었으며 이 모듈은 high order functions 과 같이 볼 가치가 있습니다.

4) 수학적 스타일:

파이썬에서 목록 조작을 위한 선호하는 스타일인 List comprehensions은 버전 2.0에서 PEP 202에 의해 도입된 이후로 이용되었습니다. 이에 대한 이유는 목록 표현식이 현재 map()와 filter() 및 중첩된 루프 사용 상황에서 목록을 더 간결하게 생성하는 방법을 제공하기 때문입니다.

cleaned_list = [ x for x in some_list if x is not thing ]

제너레이터 표현식은 PEP 289 버전 2.4에서 소개되었습니다. 제너레이터 표현식은 전체 목록을 생성하고 메모리에 저장할 필요가 없는 경우(원하지도 않는 경우)와 같은 상황에서 더 나은 성능을 발휘합니다 - 요소를 한 번에 하나씩 반복하려는 경우입니다. 목록을 반복하는 경우에는 제너레이터 표현식을 lazy evaluated 목록 내포식처럼 생각할 수 있습니다:

for item in (x for x in some_list if x is not thing):

do_your_thing_with(item)

GvR 님이 게시한 this Python history blog 포스트를 확인하세요.

이 구문은 수학에서의 set-builder notation에서 영감을 받았습니다.

파이썬 3에는 set과 dict comprehensions도 있습니다.

노트

당신은 #$$&@&&$$& 연산자 대신에 is not ( the difference is important )를 사용하고 싶을 수 있습니다.

리스트 복사를 함의하는 방법 비평가들에게: 대중적인 믿음과는 달리, 제너레이터 표현식이 항상 리스트 축약보다 효율적인 것은 아닙니다. 불평하기 전에 프로파일링 해보세요.

답변 2

리스트에서 항목을 삭제하는 방법은 매우 간단합니다. 우선 리스트에서 해당 항목이 존재하는지 여부를 확인합니다. 그러면 존재하는 항목을 삭제할 수 있습니다.

이 작업을 수행하는 몇 가지 방법이 있습니다. 일반적인 방법 중 하나는 인덱스를 사용하여 항목을 삭제하는 것입니다. 다른 방법은 remove() 메소드를 사용하여 항목을 삭제하는 것입니다.

인덱스를 사용하여 항목을 삭제하는 방법은 간단합니다. 우선 리스트에서 삭제할 항목의 위치를 찾습니다. 그런 다음 pop() 메소드를 사용하여 해당 위치에 있는 항목을 삭제합니다. 아래는 코드 예시입니다.

my_list = ['apple', 'banana', 'orange']

if 'banana' in my_list:

index = my_list.index('banana')

my_list.pop(index)

remove() 함수를 사용하여 삭제할 항목을 지정하는 것도 가능합니다. 이 함수는 리스트에서 첫 번째로 나타나는 항목을 삭제합니다. 아래는 코드 예시입니다.

my_list = ['apple', 'banana', 'orange']

if 'banana' in my_list:

my_list.remove('banana')

필요한 경우, 리스트에서 여러 항목을 삭제할 수도 있습니다. 이를 위해서는 for 루프와 같은 반복문을 사용하여 모든 항목을 확인하고 조건에 맞는 모든 항목을 삭제합니다.

코드 예시:

my_list = ['apple', 'banana', 'orange', 'banana', 'cherry']

while 'banana' in my_list:

my_list.remove('banana')

print(my_list)

위의 코드는 리스트에서 모든 'banana' 항목을 삭제합니다. 이 방법은 여러 가지 조건에 따라 다양한 종류의 항목을 제거하는 경우에도 유용합니다.

총괄하여, 리스트에서 아이템을 삭제하는 것은 매우 간단합니다. 인덱스 또는 remove() 함수와 같은 다양한 방법을 사용하여 필요한 경우 해당 아이템을 제거할 수 있습니다. 이러한 방법을 사용하여 리스트를 유지보수하는 것은 프로그래밍에서 매우 중요한 요소입니다.

반응형
Comments