파이썬의 문자열 목록에서 빈 문자열을 모두 제거하고 싶습니다.
내 생각은 다음과 같습니다.
while '' in str_list:
str_list.remove('')
이 작업을 수행하는 더 파이썬적인 방법이 있습니까?
답변
나는 사용할 것이다 filter
:
str_list = filter(None, str_list)
str_list = filter(bool, str_list)
str_list = filter(len, str_list)
str_list = filter(lambda item: item, str_list)
파이썬 3은에서 반복자를 반환 filter
하므로list()
str_list = list(filter(None, str_list))
답변
리스트 이해력을 사용하는 것이 가장 파이썬적인 방법입니다.
>>> strings = ["first", "", "second"]
>>> [x for x in strings if x]
['first', 'second']
업데이트 된 데이터를 확인해야하는 다른 참조가 있으므로 목록을 내부에서 수정해야하는 경우 슬라이스 할당을 사용하십시오.
strings[:] = [x for x in strings if x]
답변
filter에는 실제로 다음과 같은 특별한 옵션이 있습니다.
filter(None, sequence)
False로 평가되는 모든 요소를 필터링합니다. bool, len 등과 같은 실제 호출 가능 항목을 사용할 필요가 없습니다.
map (bool, …)과 동일하게 빠릅니다.
답변
>>> lstr = ['hello', '', ' ', 'world', ' ']
>>> lstr
['hello', '', ' ', 'world', ' ']
>>> ' '.join(lstr).split()
['hello', 'world']
>>> filter(None, lstr)
['hello', ' ', 'world', ' ']
시간 비교
>>> from timeit import timeit
>>> timeit('" ".join(lstr).split()', "lstr=['hello', '', ' ', 'world', ' ']", number=10000000)
4.226747989654541
>>> timeit('filter(None, lstr)', "lstr=['hello', '', ' ', 'world', ' ']", number=10000000)
3.0278358459472656
공지 사항 filter(None, lstr)
공백으로 빈 문자열을 제거하지 않고는 ' '
, 단지 멀리 프 i (prune) ''
동안 ' '.join(lstr).split()
제거합니다 모두.
filter()
공백 문자열을 제거한 상태에서 사용하려면 시간이 더 걸립니다.
>>> timeit('filter(None, [l.replace(" ", "") for l in lstr])', "lstr=['hello', '', ' ', 'world', ' ']", number=10000000)
18.101892948150635
답변
@ Ib33X의 답변은 훌륭합니다. 빈 문자열을 모두 제거하려면 스트립 후 제거하십시오. 스트립 방법도 사용해야합니다. 그렇지 않으면 공백이 있으면 빈 문자열도 반환합니다. “”도 해당 답변에도 유효합니다. 따라서 달성 할 수 있습니다.
strings = ["first", "", "second ", " "]
[x.strip() for x in strings if x.strip()]
이에 대한 답은입니다 ["first", "second"]
.
방법을 대신
사용하려면 filter
다음과 같이하십시오
list(filter(lambda item: item.strip(), strings))
. 이것은 동일한 결과를 제공합니다.
답변
x 대신에 빈 문자열을 제거하기 위해 if X! = ”을 사용합니다. 이처럼 :
str_list = [x for x in str_list if x != '']
이렇게하면 목록에 없음 데이터 형식이 유지됩니다. 또한 목록에 정수가 있고 그 중 하나가 0 인 경우에도 보존됩니다.
예를 들어
str_list = [None, '', 0, "Hi", '', "Hello"]
[x for x in str_list if x != '']
[None, 0, "Hi", "Hello"]
답변
목록의 크기에 따라 새 목록을 만드는 대신 list.remove ()를 사용하는 것이 가장 효율적일 수 있습니다.
l = ["1", "", "3", ""]
while True:
try:
l.remove("")
except ValueError:
break
이것은 새로운 목록을 만들지 않는 장점이 있지만 매번 처음부터 검색해야한다는 단점이 있습니다. while '' in l
위에서 제안한 것과 달리 검색 할 때마다 한 번만 검색하면됩니다 ''
(확실히 최선을 유지할 수있는 방법이 있습니다) 두 가지 방법이지만 더 복잡합니다).