2012-09-03 1 views
2

내가 그들 중 일부는 점 까지 비슷한하지만파이썬 : 목록을 줄일 수 있지만 계속 자세한 내용은

['abc.1', 
'abc.2', 
'abc.3', 
'abc.7', 
'xyz.1', 
'xyz.3', 
'xyz.11', 
'ghj.1', 
'thj.1'] 

난에서 생산 할 점 다음의 숫자 차이되는 항목의 목록을 갖고 있다고 이 목록 배수를 축소하지만 데이터, 즉 숫자의 일부를 보존하는 새로운 목록 그래서 위의 목록은

내가 생각했던 것을
[('abc',('1','2','3','7')) 
('xyz',('1','3','11')) 
('ghj',('1')) 
('thj',('1'))] 

는, 첫 번째 목록이로 분할 할 수있는 새 목록을 생성한다 접미사 쌍으로 점을 찍어 라 하지만 내가 어떻게 그룹이 질문은 noobish이며, 와우, 나는 훌륭한 많은 기대 didnt는

... 미리 감사하면 두 번째

미안 잃지 않고 첫 번째 부분에 의해 쌍 너무 빨리 응답 덕분

+1

귀하의 초기 목록이 유효 파이썬 코드가 아닙니다. 그것들은 줄 일까? – robert

+0

예, 문자열입니다. 코드 란 뜻이 아닙니다. 혼란스러운 점은 죄송합니다. – FlashDD

답변

1

는 분리 기능을 갖는지도 목록의 첫 번째 요소를 취하는 itertools.groupby 키를 사용하고, 결과적으로 두 번째 요소를 수집한다.

from itertools import groupby, imap 

list1 = ["abc.1", "abc.2", "abc.3", "abc.7", "xyz.1", "xyz.3", "xyz.11", "ghj.1", "thj.1"] 

def break_up(s): 
    a, b = s.split(".") 
    return a, int(b) 

def prefix(broken_up): return broken_up[0] 
def suffix(broken_up): return broken_up[1] 

result = [] 
for key, sub in groupby(imap(break_up, list1), prefix): 
    result.append((key, tuple(imap(suffix, sub)))) 

print result 

출력 :

[('abc', (1, 2, 3, 7)), ('xyz', (1, 3, 11)), ('ghj', (1,)), ('thj', (1,))] 
+0

이 솔루션은'defaultdict'를 기반으로 한 솔루션과는 달리 입력 목록의 크기에 대한 추가 저장 공간을 할당하지 않습니다. 물론 결과 목록을 제외하고는 목록에 추가하는 대신 값을 양보하면 쉽게 피할 수 있습니다. – user4815162342

+0

이것은 매우 흥미로운 해결책입니다. 완전히 이해할 수있는 기능적 프로그래밍에 대해 더 배워야합니다. 이 솔루션은 – FlashDD

+0

groupby (sequence, keyfun)는 keyfun에 따라 시퀀스를 가져 와서 같은 것으로 보이는 요소별로 그룹화합니다. 당신이 그것에서 벗어나는 것은 (키, 요소 ...)의 연속적인 쌍입니다. 이 솔루션은'imap'을 사용하여 목록 요소를 구성 요소로 분해합니다 - 접두어 (첫 번째)와 접미어 (초). 그런 다음'groupby'에게 접두어로 목록 항목을 그룹화하지만 모든 접미사를 유지하도록 지시합니다. 구술에도 불구하고,이 해결책은 원래 질문의 정신에 가장 가깝게 보인다. – user4815162342

5
from collections import defaultdict 

d = defaultdict(list) 

for el in elements: 
    key, nr = el.split(".") 
    d[key].append(nr) 

#revert dict to list 
newlist = d.items() 
+0

+1 : 이것은 단순 반복 솔루션이 대안보다 훨씬 좋은 경우의 좋은 예라고 생각합니다. – DSM

+0

이것은 매우 우아하고 감사합니다 – FlashDD