2009-12-06 4 views
3

튜플 목록을 파이썬을 사용하여 중첩 목록으로 변환하려고합니다. 어떻게해야합니까?파이썬을 사용하여 튜플 목록을 중첩 목록으로 변환

[(1, 5), (5, 4), (13, 3), (4, 3), (3, 2), (14, 1), (12, 1), 
(10, 1), (9, 1), (8, 1), (7, 1), (6, 1), (2, 1)] 

지금 내가이 (목록에 무시하고 중첩 된 두 번째 값)처럼 갖고 싶어 :

[ [1], [5], [13, 4], [3], [14, 12, 10, 9, 8, 7, 6, 2] ] 

나는 (두 번째 값으로 분류) 튜플의 정렬 된 목록을

여기에 다른 스레드를 보았습니다. map 등이 사용되었지만 완전히 이해하지 못했습니다. 누구든지이 일을 '올바른'파이썬 방법에 대한 통찰력을 제공 할 수 있습니까?

답변

11
from operator import itemgetter 
from itertools import groupby 

lst = [(1, 5), (5, 4), (13, 3), (4, 3), (3, 2), (14, 1), 
     (12, 1), (10, 1), (9, 1), (8, 1), (7, 1), (6, 1), (2, 1)] 

result = [[x for x, y in group] 
      for key, group in groupby(lst, key=itemgetter(1))] 

groupby(lst, key=itemgetter(1))이 모든 요소가 같은이있는 내 lst의 연속 요소 그룹을 생성을 1 (0에서부터 계산) 항목. [x for x, y in group]은 각 그룹 내의 각 요소의 0 번째 항목을 유지합니다.

+0

나는 이것을 좋아했다. 간단하고 매핑이 필요하지 않습니다. – proxylittle

+0

오. nvm .. typo. – proxylittle

+0

아마도'sort'는 2-tuples의리스트가 아닌 정수의리스트입니다. –

0

이 더 큰 집합이 될 것입니다 얼마나 빨리 몰라,하지만 당신은 그런 일 할 수있는 :

input = [ 
    (1, 5), (5, 4), (13, 3), (4, 3), (3, 2), (14, 1), 
    (12, 1), (10, 1), (9, 1), (8, 1), (7, 1), (6, 1), 
    (2, 1) 
] 

output = [[] for _ in xrange(input[0][1])] 
for value, key in input: 
    output[-key].append(value) 

print output # => [[1], [5], [13, 4], [3], [14, 12, 10, 9, 8, 7, 6, 2]] 
+0

len (출력)이 가장 높은 키 값과 일치해야하고 키 값이 항상 연속적이라고 가정합니다. – ironfroggy

+0

그래, 나는 OP가 '입력'과 '출력'의 색인을 일치 시키길 원한다고 생각했다. '(3, 2)'가'input' 중에 나오면,'output [-2]'는 빈리스트가됩니다. 하나의 데이터 세트만으로는 말하기가 어렵습니다. –

2

그것은 조금 복잡하지만, 당신은 itertools.groupby 기능을 수행 할 수 있습니다

>>> lst = [(1, 5), (5, 4), (13, 3), (4, 3), (3, 2), (14, 1), (12, 1), 
(10, 1), (9, 1), (8, 1), (7, 1), (6, 1), (2, 1)] 
>>> from operator import itemgetter 
>>> import itertools 
>>> [map(itemgetter(0), group) for (key,group) in itertools.groupby(lst, itemgetter(1))] 
[[1], [5], [13, 4], [3], [14, 12, 10, 9, 8, 7, 6, 2]] 
>>> 

설명 : GROUPBY이 그룹이 항목의 순서로 정의 된 각 그룹에 대한 반복자를 반환 별도의 매개 변수로 전달 된 함수에 의해 반환되는 값과 동일한 값을가집니다. itemgetter (1)은 인수 x로 호출 될 때 x [1]을 반환하는 함수를 생성합니다. groupby 반복자는 두 개의 값, 즉 사용 된 키와 튜플 인 원래 값의 시퀀스를 반환하기 때문에 map (itemgetter (0), group)이 수행하는 두 번째 값을 각 튜플에서 제거해야합니다 .

+0

좋은뿐만 아니라 당신의 마지막 라인은 혼란 스러워요, 내가 mapstuff alittle을 배울 필요가있다. 그리고 나는 거의 같은 로베르토를 게시했다고 생각한다. 하지만 고마워! – proxylittle

1
어쩌면 가장 pythonesque 대답

하지만,이 작품 :

d = {} 

a = [(1,5), (5,4), (13,3), (4,3), (3,2), (14,1), (12,1)] 

for value in a: 
    if value[0] not in d: 
     d[ value[0] ] = [] 
    d[ value[0] ].append(a[1]) 

print d.values() 
+0

나는'value [0] not in d'에 대한 체크 대신 setdefault()를 사용하여 이것을 향상시킬 것이다. – ironfroggy

1

간단한 솔루션 :

n_list = [] 
c_snd = None 
for (fst, snd) in o_list: 
    if snd == c_snd: n_list[-1].append(fst) 
    else: 
    c_snd = snd 
    n_list.append([fst]) 

설명 : 튜플의 현재 두 번째 부분을 저장하는 데 c_snd를 사용합니다. 변경된 경우 fst으로 시작하는이 새로운 두 번째 값에 대해 n_list에서 새 목록을 시작하십시오. 그렇지 않으면 n_list의 마지막 목록에 fst을 추가하십시오.

관련 문제