2013-05-02 2 views
1

:파이썬 : 중첩 된 목록 수정 나는 형식으로 짝 데이터의 중첩 된 목록을

mylist = [['item1', 'some other stuff', 'value1'],['item1', 'some other stuff', 'value2'],['item2', 'some other stuff', 'value3'],['item2', 'some other stuff', 'value4']] 

어떻게 다음을 수행하는 아무 생각이 없다,하지만 난해야합니다

나는 목록이 필요 같은 분류 할 수 있습니다 : 항목이 다른 값 목록에서 여러 번 반복되면

[['item1', 'value1', 'value2'], ['item2', 'value3', 'value4']] 

그래서 항목의 내 목록, 모든 값은 해당 항목에 분류되어야한다.

도움을 주시면 감사하겠습니다.

감사

답변

4

사전을 사용하여 항목을 값 목록에 매핑 해 보겠습니다. 새로운 값을 추가 할 목록을 알아 내려면 일종의 선형 검색 함수를 작성하는 대신 mydict[item] 일 뿐이므로 목록보다 훨씬 쉽고 빠릅니다.

[['item2', 'value3', 'value4'], ['item1', 'value1', 'value2']] 
:이 당신에게 제공

groupedlist = [[k] + v for k, v in mydict.items()] 

: 당신이 원하는 경우

{'item1': ['value1', 'value2'], 'item2': ['value3', 'value4']} 

이제 우리는, 목록에 다시 그 사전을 변환 할 수 있습니다

mydict = {} 
for item, otherstuff, value in mylist: 
    mydict.setdefault(item, []).append(value) 

이 당신에게 제공


큰 단점은 일단 물건을 사전에 집어 넣으면 원래 주문을 잃게된다는 것입니다. 첫 번째 항목이 item2의 첫 번째 항목보다 먼저 왔기 때문에 item1이 먼저 오게 될 것으로 예상했다면 (또는 item2의 마지막 항목이 item1 이후에 온 것이기 때문에) 잃어버린 것입니다. 중요한 경우 OrderedDict을 사용할 수 있습니다.

큰 장점은 종종 사전이 아니라 목록이 필요하다는 것입니다.

데이터가 정렬되지 않은 경우 groupby(…sorted(…))은 O (NlogN) 정렬이 필요하지만이 솔루션은 O (N)입니다. 일반적으로 차이는 없습니다. 그리고 만약 그렇다면, 주어진 파이썬 구현과 플랫폼에 대한 상수 - 인자 차이가 어쨌든 차이를 능가 할 수 있습니다. 그러나 성능이 중요한 경우 두 솔루션을 모두 테스트하고 더 빠른 솔루션을 사용하십시오.

+0

대단히 감사합니다. 매우 도움이되었습니다. – user2236076

2

목록은 다음 먼저 정렬 할 수 있습니다 첫 번째 항목에 따라 분류되지 않은 경우, itertools.groupby을 사용할 수 있습니다. 이 결과는 정렬되지 않은 데이터의 경우 O(NlogN) 복잡도, 정렬 된 데이터의 경우 O(N)이됩니다.

>>> from itertools import groupby 
>>> [[k]+[x[-1] for x in v] for k,v in groupby(mylist,key=lambda x:x[0])] 
[['item1', 'value1', 'value2'], ['item2', 'value3', 'value4']] 

사용 defaultdict, 그것은 O(N) 복잡성을 모두 분류 및 정렬되지 않은 데이터 일 것입니다.

>>> from collections import defaultdict 
>>> dic=defaultdict(list) 
>>> for x in mylist: 
...  key=x[0] 
...  dic[key].append(x[-1]) 
...  
>>> [[k]+v for k,v in dic.items()] 
[['item2', 'value3', 'value4'], ['item1', 'value1', 'value2']] 
+1

아닙니다. 'x [1]'이 아니라'x [2]'또는'x [-1]'이 필요합니다. – abarnert

+0

@abarnert 오! OP가 입력을 변경했습니다. –

+0

앞으로의 독자를 위해 : 내가 OP 인 경우, 아마도이 답변을 내 대신 수락했을 것입니다. 실제로 dict로 끝내고 싶다면 dict을 작성하면 의도가 분명해집니다. 그러나 "list [where] values를 그룹화해야합니다 ..."로 끝내려면 "groupby"가 더 명확하게 말합니다. – abarnert