Python에서 얕은 목록 병합

| | | | | | | | | | | | | |

목록 이해로 반복 가능한 목록을 평면화하는 간단한 방법이 있습니까, 아니면 실패할 경우 성능과 가독성의 균형을 유지하면서 이와 같이 얕은 목록을 평면화하는 가장 좋은 방법은 무엇이라고 생각하십니까?

다음과 같이 중첩 목록 이해를 사용하여 이러한 목록을 병합하려고 했습니다.

[image for menuitem for menuitem in list_of_menuitems] 

하지만 name "menuitem"이 정의되지 않았으므로 NameError 유형에 문제가 생겼습니다. 인터넷 검색과 Stack Overflow를 둘러본 후 reduce 문으로 원하는 결과를 얻었습니다.

reduce(list.__add__, map(lambda x: list(x) ), list_of_menuitems)) 

그러나 이 메소드는 x가 Django QuerySetlist(x) 호출이 필요하기 때문에 상당히 읽을 수 없습니다. code> object.

결론:

이 질문에 참여해 주신 모든 분들께 감사드립니다. 다음은 내가 배운 내용을 요약한 것입니다. 다른 사람들이 이러한 관찰을 추가하거나 수정하려는 경우를 대비하여 커뮤니티 위키도 만들고 있습니다.

내 원래 reduce 문은 중복되며 다음과 같이 작성하는 것이 좋습니다.

>>> reduce(list.__add__, (list(mi) for mi in list_of_menuitems)) 

중첩 목록 이해를 위한 올바른 구문입니다(Brilliant summary dF!):

>>> [mi용 이미지 in list_of_menuitems for image in mi] 

그러나 이러한 방법 중 어느 것도 itertools.chain을 사용하는 것만큼 효율적이지 않습니다.

>> ; from itertools import chain >>> list(chain(*list_of_menuitems)) 

그리고 @cdleary가 언급했듯이, chain.from_iterable은 다음과 같습니다.

>>> 체인 = itertools.chain.from_iterable([[1,2],[3],[5,89],[],[6]]) >> print(list(chain)) >>> [1, 2, 3, 5, 89, 6]