2016-08-10 2 views
0

을 만들 수 있습니다 :비교 값은 내가이 스타일리스트가 일치하는 목록

[ [x,y,z] , [x1,y1,z1] , [...]]. 

내 문제는 내가 어떻게 든 분류 값을 갖는 새 목록을 만들고 싶어한다는 것입니다. 첫 번째 단계에서는 모든 동일한 x와 y에 대해 해당 z 값을 갖는 목록을 만들고 싶습니다. 다음은 예이다 :

원시 데이터 :

[[1,2,5],[1,2,6],[1,2,7],[2,2,10],[2,2,11]] 

가공 데이터 : I 그런리스트 싶은 최종 단계

[[1,2 [5,6,7]],[2,2[10,11]] 

:

[[x values], [y values], [z minimum values], [z length]] 
[[1,2],[2,2],[5,10],[3,2]] 

우선 나는 가능한 모든 조합의 x와 y (내 데이터에서 무한하지 않음)를 만들려고 시도했지만, 그 다음엔 그냥 compari라고 생각했다. ng 연속 값은 더 쉬울 것이나, 나는 그것을 이해하지 않았다.

+1

'itertools.groupby'가 유용해야합니다. – Netwave

답변

2

처음 시작하는 경우 문제를 더 작은 문제로 나누고 조금씩 해결하는 것이 유용 할 것입니다.

첫 번째 단계는 가장 먼저 사전을 사용하여 정보를 수집하는 것입니다.

원래 목록의 모든 트리플릿을 살펴보고 각 키가 고유 한 (x, y) 쌍인 사전을 만듭니다. 값은 목록의 z 값이됩니다. 우리는 항목이 이미 목록에있는 경우 수동으로 점검 할 필요가 없도록

import collections 

l = [[1,2,5],[1,2,6],[1,2,7],[2,2,10],[2,2,11]] 
mapping = collections.defaultdict(list) 

for x, y, z in l: 
    mapping[(x, y)].append(z) 

# >> defaultdict(<type 'list'>, {(1, 2): [5, 6, 7], (2, 2): [10, 11]}) 

우리는 list 생성자와 더불어, defaultdict을 사용하고 있습니다.

이제 사전이 생기므로 첫 번째 목록을 쉽게 만들 수 있습니다. 우리는 모든 키와 값을 살펴보고 적절한 목록 형식을 만들어야합니다.

intermediate_list = [[x, y, zs] for (x, y), zs in mapping.iteritems()] 
# >> [[1, 2, [5, 6, 7]], [2, 2, [10, 11]]] 

세 번째 단계에서는 사전을 다시 사용할 수 있습니다. 목록의 첫 번째 항목은 사전의 모든 키가되며 최소값과 최대 값을 계속 추가해야합니다.

final_list = [] 
minimums = [] 
lengths = [] 

for (x, y), zs in mapping.iteritems(): 
    final_list.append([x, y]) 
    minimums.append(min(zs)) 
    lengths.append(len(zs)) 

final_list.append(minimums) 
final_list.append(lengths) 

# >> [[1, 2], [2, 2], [5, 10], [3, 2]] 
+0

답장을 보내 주셔서 감사합니다! 나는 그것에서 많은 것을 배웠다! – Cetarius