2016-08-11 2 views
2

목록 및 항목 목록을 병합하고 싶습니다. 아래 코드는목록 및 항목으로 목록 병합 : 중첩 된 for 루프가있는 목록 작성 및 기타 조건

[[1],[2,3],[4]] 

에 작동합니다하지만이 기능을 원하는

[[1],[2,3],[4],5] 

그 위의 목록을 위해 그것을 할 것없는 목록

def flatten(li): 
return [item for sublist in li for item in sublist] 

의 목록에만 작동 - 무엇인가

[item if isinstance(sublist, list) else sublist for sublist in li 
for item in sublist] 

위의 코드는 오류를 발생시킵니다.

[[1],[2,3],[4],5] 

에 그것을 시도 나에게주는

TypeError: 'int' object is not iterable 

사람이 나에게하지 않는 목록 이해를 줄 수 있습니까?

편집 :

목록 통합 만 원합니다.

+0

목록 작성에 몇 가지 변형을 시도 했습니까? 그것은 목록 이해력이어야합니까? - 때로는 단계를 작성하는 것만으로 프로세스를 보는 것이 더 쉬울 수도 있습니다. 그런 다음 생성기 기능으로 전환하거나 목록 이해를 구성하기 위해 역 단어를 사용할 수 있습니다. – wwii

+0

왜 목록 이해력을 원하십니까? 이렇게하는 함수를 만드는 것이 훨씬 더 좋고 더 읽기 쉬울 것입니다. 이것에 대한 답과 같이 : [불규칙한리스트의 목록] (python) (http://stackoverflow.com/questions/2158395/flatten-an-irregular-list-of-lists-in -python) – Copperfield

+0

필자는 목록 이해력을 가지고 그렇게 할 수 있는지 알고 싶습니다. 지식과 기술이 부족하여 실제로 그렇게 할 수 없거나 실제로 불가능한 이유와 이유가 무엇인지를 알고 싶습니다. 이것은 언어에 대한 나의 지식을 풍부하게 할 것이다. 결과에 관한 것이 아닙니다. –

답변

0
from itertools import chain 

def flatten(li): 
    if isinstance(li, list): 
     li = [flatten(x) for x in li] 
     return list(chain(*li)) 
    else: 
     return [li] 

def flatten2(li): 
    return list(chain(*[[x] if not isinstance(x, list) else flatten2(x) for x in li])) 

심지어에서 작동 : 그렇지

[[1], [[2, 3], 4], [5], 6] -> [1, 2, 3, 4, 5, 6] 

:

def flatten3(li): 
    return [x for inner in [[item] if not isinstance(item, list) else item for item in li] for x in inner] 
+0

나는 목록의 이해력만을 원한다. –

+0

여기에는 순수한 이해력 버전 – Cabu

1
def flatten(li): 

return [ x for x in li if isinstance(x,int) ] + [item for sublist in li if isinstance(sublist,list) for item in sublist] 
+0

가 있습니다. 그래서 그것은 불가능합니다. :/ –

+0

예, 가능합니다. flatten3 내 대답을 참조하십시오 :) – Cabu

1

다른 사용자가 제안했듯이, 목록을 평평하게 재귀 함수를 사용하여 작품을 정말 잘이에 케이스. 하지만 여기에는 한 줄로 된 목록이 있습니다 (). 가장 효율적인 것은 아니지만입니다.

from collections import Iterable 
l = [{},2,[41,123,'str'],32,(4324),3,1,(212,3213),[2]] 
print [num for subitem in (subquery if isinstance(subquery, Iterable) else [subquery] for subquery in l) for num in subitem] 
>>> [2, 41, 123, 'str', 32, 4324, 3, 1, 212, 3213, 2]