2013-08-14 3 views
2

많은 보일러 플레이트 코드없이 파이썬에서이 작업을 수행 할 방법을 찾고 있습니다.파이썬에서의 필터 연산

[(a,4),(b,4),(a,5),(b,3)] 

내가 나를 처음 튜플 값을 기준으로 정렬 할 수 있도록하는 기능을 찾아과 같이 함께 목록 값을 병합하려고 :

[(a,[4,3]),(b,[4,5])] 

내가 목록을 가지고 가정

나는 이것을 순진한 방법으로 할 수 있음을 알고 있지만 더 좋은 방법이 있는지 궁금해하고있었습니다.

+3

출력에서 ​​3을 5로 만들었습니까? – roippi

답변

2

사용 collections.defaultdict(list) :

from collections import defaultdict 

lst = [("a",4), ("b",4), ("a",5), ("b",3)] 

result = defaultdict(list) 
for a, b in lst: 
    result[a].append(b) 

print sorted(result.items()) 

# prints: [('a', [4, 5]), ('b', [4, 3])] 

정렬하기 전에 알고리즘 O(n) 복잡성이있다; 알고리즘에 의해 그룹이있다 O(n * log(n)) 및 설정/목록/딕셔너리의 이해 '가'는 'b는'초기 목록 예상 된 결과입니다 있다고 가정 O(n^2)

+0

'i [0]'과'i [1]'? 튜플을 풀지 않는 이유는 무엇입니까? – user2357112

+0

아니야. '키에 대한 가치, lst :' – user2357112

+0

아, 진짜 이유는 1:22 AM –

0

보다 더 큰 무언가가, 다음 코드는 작동합니다

d = {} 
for k, v in a: 
    if k in d: 
     d[k].append(v) 
    else: 
     d[k] = [v] 
b = d.items() 
+0

이것은 내가 작성한 순진한 해결책입니다 –

+0

목록의 키 (집합 (map) (lambda x : x [0], set, a)))] –

0

매우 효율적이지만 (세트 + 목록 + DICT 이해와) 충분하지 않습니다 :

>>> data = [("a",4), ("b",4), ("a",5), ("b",3)] 
>>> {key: [v for k, v in data if k == key] 
... for key in {k for k, v in data} 
... }.items() 
[('a', [4, 5]), ('b', [4, 3])] 
+0

나는 이것이 좋지만 악몽을 읽을 것이라고 확신한다. 나는 모든 사람들이 그것을 읽고 싶어한다. –

+0

이것은 어디에도 없습니다. 그러나 진술을 사용하지 않고 그것을 수행하는 방법입니다 : D –

+0

정말 효율적이지는 않지만 여전히 이해하기가 가장 쉽다고 생각합니다. –

0

(다시 '는이'는 초기 목록을 가정) 또 다른 옵션

,
[(key,[v2 for k2, v2 in a if k2 == key ]) for key in list(set(map(lambda x: x[0], a)))] 
+0

집합은 이미 반복 가능하기 때문에'list' 로의 캐스팅은 필요하지 않습니다. –