0

다음 방법으로 중첩 된 for 루프를 사용하지 않고 파이썬 튜플을 그룹화/집계/축소하는 가장 좋은 방법은 무엇입니까? 예를 들어파이썬리스트/튜플의 세 번째 값을 처음 두 값으로 그룹화/집계/축소하는 방법 (for 루프를 사용하지 않고)?

, 주어진 다음 튜플 :

entry1 = ('name1', 'surname1', 'product1') 
entry2 = ('name1', 'surname1', 'product2') 
entry3 = ('name1', 'surname1', 'product3') 
entry4 = ('name2', 'surname2', 'product1') 
entry5 = ('name2', 'surname2', 'product2') 
entry6 = ('name2', 'surname2', 'product3') 

어떻게 기능 func :

func(entry1, entry2, entry3, entry4, entry5, entry6) 

반환 유사한 형식의 데이터 :

(('name1', 'surname1', ('product1', 'product2', 'product3')), 
('name2', 'surname2', ('product1', 'product2', 'product3'))) 

참고 :

  • 결과의 순서는 중요하지 않습니다.
  • 결과는 목록 또는 튜플 일 수 있습니다.
  • 적용 독창성은 괜찮지 만 필수 사항은 아닙니다. 그 결과는 ('name1', 'surname1', ('product1', 'product1', 'product2', 'product3'))과 같은 결과입니다.
+0

가 왜 'NAME2 '와'surname2'는'name1'과'surname1' 앞에옵니다? – Ryan

+0

좋은 지적! 나는 그 결과에있는 순서가 중요하지 않다는 것을 언급하는 것을 잊었다, 반영하기 위하여 포스트를 새롭게했다 – Greg

답변

1

먼저 그룹에 collections.defaultdict를 사용하고 나중에 목록 또는 튜플로 변환 할 수 있습니다

from collections import defaultdict 

def func(*args): 
    d = defaultdict(list) 
    for entry in args: 
     d[entry[0], entry[1]].append(entry[2]) 
    return tuple((k[0], k[1], tuple(v)) for k, v in d.items()) 

테스트 :

entry1 = ('name1', 'surname1', 'product1') 
entry2 = ('name1', 'surname1', 'product2') 
entry3 = ('name1', 'surname1', 'product3') 
entry4 = ('name2', 'surname2', 'product1') 
entry5 = ('name2', 'surname2', 'product2') 
entry6 = ('name2', 'surname2', 'product3') 
print(func(entry1, entry2, entry3, entry4, entry5, entry6)) 

결과 :

(('name1', 'surname1', ('product1', 'product2', 'product3')), 
('name2', 'surname2', ('product1', 'product2', 'product3'))) 
+0

그것은 믿을 수 없을만큼 효율적이다, 감사합니다 :) – Greg