[python] 문자열 목록에서 빈 문자열 제거

파이썬의 문자열 목록에서 빈 문자열을 모두 제거하고 싶습니다.

내 생각은 다음과 같습니다.

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위에서 제안한 것과 달리 검색 할 때마다 한 번만 검색하면됩니다 ''(확실히 최선을 유지할 수있는 방법이 있습니다) 두 가지 방법이지만 더 복잡합니다).