목록에 항목이 있는 경우 어떻게 삭제합니까?
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) 거의 영어 스타일:
하려면 을 사용합니다.in
operator 、 「 」를 합니다.remove
★★★★★★ 。
if thing in some_list: some_list.remove(thing)
remove
는 처음 발생한 합니다.thing
오카렌스를 하려면 , 「」를 while
if
.
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]
번째 가 " "인 경우"None
3.), Python 3.x에서는 Python 3.와 동등합니다.(item for item in iterable if function(item))
할 때 식과 는, 「」를 동봉할 가 있습니다. 이는 정리된 목록을 반복하고 폐기하는 경우만 해당됩니다. 그러나 목록이 정말로 필요한 경우 목록을 묶어야 합니다.filter()
불러들이다list()
컨스트럭터 - * 파이썬에서는 이 리스피 풍미의 구성물은 조금 낯설게 여겨집니다.2005년 경, Guido는 심지어 동료들과 함께 드롭에 대해 이야기했습니다.
map
★★★★★★★★★★★★★★★★★」reduce
(reduce
functools 모듈로 이동했습니다.고차 함수를 좋아하신다면 확인해 보시기 바랍니다).
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)
- GvR의 Python 이력 블로그 투고를 참조하십시오.
- 이 구문은 수학의 set-builder 표기에서 영감을 받았습니다.
- Python 3은 또한 comprehensions를 설정하고 받아쓰기도 합니다.
메모들
- 연산자를 것 .
!=
is not
(차이가 중요) - 리스트 복사를 암시하는 메서드를 비판하는 경우: 일반적인 믿음과는 달리 제너레이터 표현이 리스트 포괄보다 항상 효율적인 것은 아닙니다.불만하기 전에 프로파일을 작성해주세요.
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
- 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에서 더 빠를 경우 속도 차이가 매그니튜드 순서로 나타납니다).
- 는 '어리다'를 하는 것을 해 볼 수 .
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
'sourcecode' 카테고리의 다른 글
'\r' 이스케이프 시퀀스의 용도는 무엇입니까? (0) | 2022.11.26 |
---|---|
왜 python은 루프 뒤에 'else'를 사용하는가? (0) | 2022.11.26 |
Express Router 및 vuex 서비스 및 액션을 사용하여 사용자를 추가하는 방법(사후 요청) (0) | 2022.11.26 |
MySQL: 쿼리 결과에서 사용자 변수 설정 (0) | 2022.11.26 |
ERROR 1698 (28000):사용자 'root'@'localhost'에 대한 액세스가 거부되었습니다. (0) | 2022.11.26 |