sourcecode

목록에 항목이 있는 경우 어떻게 삭제합니까?

copyscript 2022. 11. 26. 08:48
반응형

목록에 항목이 있는 경우 어떻게 삭제합니까?

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에는 빈 되어 있습니다." ".

를 들어 "from"에서 "from"으로 합니다.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 "<pyshell#30>", line 1, in <module>
    if new_tag_list.index(""):
        ValueError: list.index(x): x not in list

왜 이런 일이 일어나는지, 어떻게 대처하면 좋을까요?

1) 거의 영어 스타일:

하려면 을 사용합니다.inoperator 、 「 」를 합니다.remove★★★★★★ 。

if thing in some_list: some_list.remove(thing)

remove는 처음 발생한 합니다.thing 오카렌스를 하려면 , 「」를 whileif.

while thing in some_list: some_list.remove(thing)    
  • 간단해, 아마 내 선택일 거야.소규모 리스트용(한 줄짜리 리스트는 거부할 수 없습니다)

2) 오리형 EAFP 스타일:

먼저 질문하고 마지막으로 질문하는 이러한 태도는 Python에서 흔히 볼 수 있습니다.물체가 적합한지 미리 테스트하는 대신 작업을 수행하고 관련 예외를 파악하십시오.

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
  • Python에서는 매우 관용적입니다.
  • 이것은 1위보다 성능이 좋다.
  • PEP 463은 간단한 사용법을 제외하고 여기서 편리한 짧은 구문을 제안했지만 승인되지 않았습니다.

그러나 contextlib의 suppress() contextmanager(python 3.4에서 도입)를 사용하면 위의 코드를 다음과 같이 단순화할 수 있습니다.

with suppress(ValueError, AttributeError):
    some_list.remove(thing)

이 경우에도 여러 번 발생할 것으로 예상되는 경우:

with suppress(ValueError):
    while True:
        some_list.remove(thing)

3) 기능 스타일:

은 1993년산(Python)을 손에 넣었다.lambda,reduce(),filter() ★★★★★★★★★★★★★★★★★」map()Lisp 해커의 지원으로 Lisp 해커의 도움을 받아 작업 패치를 제출했습니다*.사용할 수 있습니다.filter목록에서 요소를 제거하려면:

is_not_thing = lambda x: x is not thing
cleaned_list = filter(is_not_thing, some_list)

이 을때할 수 .bool(item) == False,맘에 들다None, 빈 빈 을 첫 할 수 , 0 , " " " " " " ) " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " 입니다.

cleaned_list = filter(None, some_list)
  • [update]: Python 2.x에서는filter(function, iterable)에는 옛에 used to 에 상당했다[item for item in iterable if function(item)] (오류)[item for item in iterable if item] 번째 가 " "인 경우"None3.), Python 3.x에서는 Python 3.와 동등합니다.(item for item in iterable if function(item))할 때 식과 는, 「」를 동봉할 가 있습니다. 이는 정리된 목록을 반복하고 폐기하는 경우만 해당됩니다. 그러나 목록이 정말로 필요한 경우 목록을 묶어야 합니다.filter() 불러들이다list()컨스트럭터
  • * 파이썬에서는 이 리스피 풍미의 구성물은 조금 낯설게 여겨집니다.2005년 경, Guido는 심지어 동료들과 함께 드롭에 대해 이야기했습니다.map ★★★★★★★★★★★★★★★★★」reduce(reducefunctools 모듈로 이동했습니다.고차 함수를 좋아하신다면 확인해 보시기 바랍니다).

4) 수학 스타일:

PEP202에 의해 버전 2.0에서 도입된 이후 Python에서 목록 수집이 선호하는 스타일이 되었습니다.그 이면에 있는 근거는 리스트 통합이 다음과 같은 상황에서 리스트를 작성할 수 있는 보다 간결한 방법을 제공한다는 것입니다.map() ★★★★★★★★★★★★★★★★★」filter()및/또는 네스트된 루프가 현재 사용됩니다.

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

제너레이터 표현은 PEP 289에 의해 버전 2.4에서 도입되었습니다.생성기 표현식은 한 번에 하나씩 반복해야 하는 경우와 같이 메모리에 전체 목록을 만들 필요가 없거나 만들고 싶지 않은 경우에 적합합니다.목록에서만 반복하는 경우 생성기 식을 느린 평가 목록 이해로 간주할 수 있습니다.

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

메모들

  1. 연산자를 것 .!=is not(차이가 중요)
  2. 리스트 복사를 암시하는 메서드를 비판하는 경우: 일반적인 믿음과는 달리 제너레이터 표현이 리스트 포괄보다 항상 효율적인 것은 아닙니다.불만하기 전에 프로파일을 작성해주세요.
try:
    s.remove("")
except ValueError:
    print "new_tag_list has no empty string"

이렇게 하면 빈 문자열의 인스턴스가 목록에서 1개만 제거됩니다(코드도 마찬가지).목록에 두 개 이상 포함할 수 있습니까?

하나의 라이너로서:

>>> s = [u'', u'Hello', u'Cool', u'Glam']
>>> s.remove('') if '' in s else None # Does nothing if '' not in s
>>> s
['Hello', 'Cool', 'Glam']
>>> 

ifindex문자열을 된 문자열을 던집니다.ValueError합니다.Value Error value value 。

try:
    i = s.index("")
    del s[i]
except ValueError:
    print "new_tag_list has no empty string"

또는 사용find이 경우 -1이 반환됩니다.

i = s.find("")
if i >= 0:
    del s[i]
else:
    print "new_tag_list has no empty string"

완전성을 위해 이 답변을 추가합니다.단, 특정 조건에서만 사용할 수 있습니다.

목록이 매우 큰 경우 목록 끝에서 삭제하면 CPython 내부에서는 다음 작업을 수행할 필요가 없습니다.memmove록록순순순순순경경경경경경경경경경경 。에 삭제할 memmove 모든 아이템을 1단계 뒤로 이동시킵니다.
일회성 삭제의 경우 성능 차이는 허용될 수 있지만, 목록이 많고 많은 항목을 삭제해야 하는 경우 성능 저하가 발생할 수 있습니다.

단, 이 경우 목록 맨 앞에 항목이 거의 없는 한 전체 목록 검색을 수행하는 것도 성능 병목현상이 될 수 있습니다.

은 보다 제거할 수 .
목록을 다시 작성할 수 있는 한.(2)

def remove_unordered(ls, item):
    i = ls.index(item)
    ls[-1], ls[i] = ls[i], ls[-1]
    ls.pop()

하지 않도록 것이 .item록에없없 없없없다다

def remove_unordered_test(ls, item):
    try:
        i = ls.index(item)
    except ValueError:
        return False
    ls[-1], ls[i] = ls[i], ls[-1]
    ls.pop()
    return True

  1. CPython을 사용하여 테스트했지만, 대부분의 경우 다른 Python 구현에서는 내부적으로 목록을 저장하기 위해 배열을 사용합니다.따라서 효율적인 목록 크기 조정을 위해 설계된 정교한 데이터 구조를 사용하지 않는 한 동일한 성능 특성을 가질 수 있습니다.

간단한 테스트 방법으로 목록 맨 앞부분에서 제거했을 때와 마지막 요소를 제거했을 때의 속도 차이를 비교합니다.

python -m timeit 'a = [0] * 100000' 'while a: a.remove(0)'

포함:

python -m timeit 'a = [0] * 100000' 'while a: a.pop()'

(두 번째 예제가 CPython 및 PyPy에서 더 빠를 경우 속도 차이가 매그니튜드 순서로 나타납니다).

  1. 는 '어리다'를 하는 것을 해 볼 수 .set특히 목록이 중복되는 내용을 저장하지 않는 경우.
    수 해야 할 도 있습니다.set할 수 btree는 데이터를 주문할 수 있는지 확인합니다.

으엑, 그렇게 복잡한 짓은 하지 마:)

★★★★★★★★★★★★★★★★★.filter()당신의 태그. bool()False문자열에 는, 「」 에 「」를 사용합니다.

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

너는 써야 한다

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

를 이 안에 .striplist()빈 문자열이 반환되지 않도록 하기 위해서입니다.

다음은 한 가지 방법으로 해결할 수 있는 방법입니다.

next((some_list.pop(i) for i, l in enumerate(some_list) if l == thing), None)

목록 복사본이 생성되지 않고 목록을 여러 번 통과하지 않으며 추가 예외 처리가 필요하지 않으며 일치하는 개체가 없으면 없음을 반환합니다.유일한 문제는 그것이 긴 진술을 만든다는 것이다.

일반적으로 예외를 발생시키지 않는 원라이너 솔루션을 찾는 경우 기본 인수를 지원하는 몇 안 되는 Python 함수 중 하나이기 때문에 next()를 사용하는 것이 좋습니다.

넌 이것만 하면 돼

list = ["a", "b", "c"]
    try:
        list.remove("a")
    except:
        print("meow")

하지만 그 방법에는 문제가 있다.예외적인 장소에 뭔가를 넣어야 해 그래서 이걸 찾았지

list = ["a", "b", "c"]
if "a" in str(list):
    list.remove("a")

언급URL : https://stackoverflow.com/questions/4915920/how-to-delete-an-item-in-a-list-if-it-exists

반응형