Programing

Python : 목록에서 빈 목록을 제거하는 방법?

crosscheck 2020. 12. 28. 21:50
반응형

Python : 목록에서 빈 목록을 제거하는 방법?


이 질문에 이미 답변이 있습니다.

빈 목록이있는 목록이 있습니다.

list1 = [[], [], [], [], [], 'text', 'text2', [], 'moreText']

빈 목록을 제거하여 다음을 얻을 수 있습니다.

list2 = ['text', 'text2', 'moreText']

list.remove ( '') 시도했지만 작동하지 않습니다.


시험

list2 = [x for x in list1 if x != []]

빈 문자열, 빈 튜플, 0과 같이 "허위"인 모든 것을 제거하려면 다음을 사용할 수도 있습니다.

list2 = [x for x in list1 if x]

filter()목록 이해력 대신 사용할 수 있습니다 .

list2 = filter(None, list1)

에 대한 None첫 번째 인수로 사용되는 경우 부울 컨텍스트 filter()에있는 지정된 목록의 모든 값을 필터링합니다 False. 여기에는 빈 목록이 포함됩니다.

파이썬에서 단일 함수 만 실행하고 나머지는 C로 수행되기 때문에 목록 이해보다 약간 빠를 수 있습니다.


호출 filter로하는 것은 None(빈리스트 인) 목록에서 모든 falsey 값을 필터링합니다

list2 = filter(None, list1)

>>> list1 = [[], [], [], [], [], 'text', 'text2', [], 'moreText']
>>> list2 = [e for e in list1 if e]
>>> list2
['text', 'text2', 'moreText']

몇 가지 옵션 :

filter(lambda x: len(x) > 0, list1)  # Doesn't work with number types
filter(None, list1)  # Filters out int(0)
filter(lambda x: x==0 or x, list1) # Retains int(0)

샘플 세션 :

Python 2.7.1 (r271:86832, Nov 27 2010, 17:19:03) [MSC v.1500 64 bit (AMD64)] on
win32
Type "help", "copyright", "credits" or "license" for more information.
>>> list1 = [[], [], [], [], [], 'text', 'text2', [], 'moreText']
>>> filter(lambda x: len(x) > 0, list1)
['text', 'text2', 'moreText']
>>> list2 = [[], [], [], [], [], 'text', 'text2', [], 'moreText', 0.5, 1, -1, 0]
>>> filter(lambda x: x==0 or x, list2)
['text', 'text2', 'moreText', 0.5, 1, -1, 0]
>>> filter(None, list2)
['text', 'text2', 'moreText', 0.5, 1, -1]
>>>

OP와 똑같은 일을하고 싶었 기 때문에이 질문을 찾았습니다. 다음 관찰 내용을 추가하고 싶습니다.

반복적 인 방법 (user225312, Sven Marnach) :

list2 = [x for x in list1 if x]

에서 list개체를 반환합니다 . 대신 필터 방식 (lunaryorn, Imran)은 버전에 따라 다르게 작동합니다.python3python2

list2 = filter(None, list1)

그것은 반환 filter의 객체 python3list의를 python2(볼 이 질문에 동시에 발견을). 이것은 약간의 차이이지만 호환 가능한 스크립트를 개발할 때 고려해야합니다.

이것은 이러한 솔루션의 성능에 대한 어떠한 가정도하지 않습니다. 어쨌든 필터 개체는 다음을 사용하여 목록으로 되돌릴 수 있습니다.

list3 = list(list2)

더 복잡한 중첩 개체에서 빈 항목을 필터링해야했습니다. 나는 그것을하기 위해 재귀 함수를 만들었다. 여기 내 SO 대답을 참조 하십시오 .


list1 = [[], [], [], [], [], 'text', 'text2', [], 'moreText']
list2 = []
for item in list1:
    if item!=[]:
        list2.append(item)
print(list2)

산출:

['text', 'text2', 'moreText']

a = [[1,'aa',3,12,'a','b','c','s'],[],[],[1,'aa',7,80,'d','g','f',''],[9,None,11,12,13,14,15,'k']]

b=[]
for lng in range(len(a)):
       if(len(a[lng])>=1):b.append(a[lng])
a=b
print(a)

산출:

[[1,'aa',3,12,'a','b','c','s'],[1,'aa',7,80,'d','g','f',''],[9,None,11,12,13,14,15,'k']]

위의 답변에 추가하여 다음 list of lists과 같은 형식 이 있다고 가정합니다 .

theList = [['a','b',' '],[''],[''],['d','e','f','g'],['']]

각 목록에서 빈 항목과 수행 할 수있는 빈 목록을 제거하려고합니다.

theList = [x for x in theList if x != ['']] #remove empty lists
for i in range(len(theList)):
    theList[i] = list(filter(None, theList[i])) #remove empty entries from the lists

새 목록은 다음과 같습니다.

theList = [['a','b'],['d','e','f','g']]

참조 URL : https://stackoverflow.com/questions/4842956/python-how-to-remove-empty-lists-from-a-list

반응형