2012-10-26 2 views
2

가정하자 내가 (다른 것들 사이)를 포함하는 목록을 하위 목록 : 내가 좋아하는 것선택적 평평 다른 유형의

[1, 2, [3, 4], {5, 6}] 

는, 선택적 방법으로 평평의 종류에 따라 그것의 요소 (예 : 난 단지 sets을 평평하게하고, 나머지 평탄화를두고 싶습니다) :

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

나의 현재 솔루션은 기능이지만,이 함께 할 수 있다면 내 지적 호기심, 나는 궁금 단일 목록 이해력?

+0

집합을 평평하게 만드는 것은 순서가 임의적 일 (목록이 정렬 됨) 때문에 많은 응용 프로그램에서 약간 재미있을 것 같습니다. – mgilson

+0

나는 그것에 관해 완전히 동의하고, 나는이 문제에 약간의 생각을 주었지만, 그것은 나의 응용에서 이것이 문제가되지 않는다는 것을 나타낸다. – cjauvin

답변

6

목록 내장은 여러 입력 항목에 해당하는 값을 결합하는 방법이 없으므로 병합을 위해 설계되지 않았습니다.

중첩 된 목록 포함으로이 문제를 해결하는 동안 최상위 목록의 각 요소를 반복 할 수 있어야합니다.

정직하게도이 기능을 사용하십시오. 그것은 가장 깨끗한 방법입니다.

+0

"LC는 병합을 위해 설계되지 않았습니다"라는 의미는 배제하지 않습니다 :'[하위 목록에있는 항목에 대한 하위 목록에 대한 항목'] 패턴은 어떨까요? – cjauvin

+2

@cjauvin : 두 번째'for item in sublist' 부분은 서브리스트가 실제로 반복 가능해야한다는 것을 요구합니다. 이것은 컬렉션에서'1'과'2' 엘리먼트의 경우가 아닙니다. 이 문제를 해결하려면 스칼라 요소에서 단일 엘리먼트 iterable을 작성해야합니다.이 엘리먼트는 senderie 쇼처럼 실행 가능하지만, 사용자가해야 할 일인지 여부는 의문의 여지가 있습니다. – abarnert

+0

@cjauvin 범용 병합 (예 : 임의 중첩 수준의 병합) 용으로 설계되지 않았습니다. 중첩 목록의 * N 차원 집합을 평면 목록으로 변환하는 데 사용할 수 있지만 중첩 목록의 다양한 차원 집합을 처리 할 수는 없습니다. – Amber

4

앰버 (Amber)는 아마도 이런 식으로 기능이 더 좋습니다. 다른 한편으로, 약간의 변화를위한 여지가 항상 있습니다. 중첩이 한 단계 이상 깊지 않다고 가정합니다. 깊이가 한 단계 이상인 경우 확실히은이 기능을 선호합니다. 그러나 그렇지 않은 경우 잠재적으로 실현 가능한 접근 방식입니다.

>>> from itertools import chain 
>>> from collections import Set 
>>> list(chain.from_iterable(x if isinstance(x, Set) else (x,) for x in l)) 
[1, 2, [3, 4], 5, 6] 

이 방법을 사용하지 않는 방법은 중첩 된 목록 내포를 포함합니다. 더 나은 두 줄에 그것을 깰 :

>>> packaged = (x if isinstance(x, collections.Set) else (x,) for x in l) 
>>> [x for y in packaged for x in y] 
[1, 2, [3, 4], 5, 6] 

내가이 중 하나가 간단한 기능보다 빠르거나 느린 지 여부에 대한 강한 직관이 없습니다. 이것들은 많은 싱글 톤 튜플을 만듭니다. 이것은 낭비입니다. 그러나 그것들은 또한 보통 LC 속도에서 발생합니다. 이것은 대개 꽤 좋습니다.

+0

고마워, 그게 좋은 해결책이야. 이제는 어떤 대답을 받아 들일지 결정하는 번거로운 문제가 있습니다.앰버 (Amber)의 의견은 그것이 내 생각에 최소한 * 가능하다는 것을 증명하는 기능 (나는 완전히 동의 함)이거나 당신의 것임을 밝힙니다. – cjauvin

+1

글쎄, 이건 실제로 어떻게 보이지 않는가? 독해력; 그것은 itertools.chain과 생성기 표현식 또는 생성기 표현식을 더하는 방법을 보여줍니다 ...하지만 중첩 된 이해력으로 변환하는 것이 독자에게 매우 쉬운 운동이라는 것을 보여 주므로 그것을주었습니다. a +1. – abarnert

+2

네가 앰버를 받아 들인다면 나는 기분을 상하게하지 않을 것이다. 그것은 아마 모든 것이 고려 된 더 나은 대답 일 것입니다. – senderle

1

당신은 funcy 라이브러리에서 flatten 기능을 사용할 수 있습니다 : 당신은 또한 its implementation 엿볼 수

from funcy import flatten, isa 

flat_list = flatten(your_list, follow=isa(set)) 

.

+0

funcy에 대한 참조를 위해 +1. – cjauvin