2014-02-16 3 views
0

나는 해결해야 할 매우 흥미로운 문제가 있습니다. 위의 문자열이 나 단어의 철자 바꾸기를 찾는 데 도움이됩니다목록의 일부를 파이썬을 사용하여 병합하십시오.

input = ['opst tops', 'opst opts', 'opst pots', 'eip pie', 'eip epi'] 

:

나는 다음과 같은 형식의 문자열을 가지고 있다고 가정합니다. 예를 들어, "tops"라는 단어는 "opts"라는 기호를 가지고 있고, 한편 "opts"라는 단어는 "opst"라는 기호를 가지고 있습니다 ... 따라서 모든 단어는 "opst"라는 기호가 함께 그룹화되어야합니다. 출력은 anagram 클래스 단어입니다.

output = ['tops opts pots', 'pie epi'] 

나는 python에 익숙하지 않고 도움이된다면 고맙겠습니다. 혼란에 대해 유감스럽게 생각합니다.

+0

무언가 해보셨습니까? – markcial

+0

은 다음과 같아야합니다 : raw = [ 'opst tops', 'opst opts', 'opst pots', 'eip pie', 'eip epi']? –

+0

네, @ da_steve101 알림을 보내 주셔서 감사합니다. –

답변

3

사용하십시오 collections.defaultdict() object 편의를 위해, 당신의 단어를 수집합니다 :

from collections import defaultdict 

words = defaultdict(list) 
for entry in raw: 
    key, word = entry.split() 
    words[key].append(word) 

raw = [' '.join(v) for v in words.values()] 

defaultdict은 코드를 여기에서 정리합니다. 그것은 키가 아직 존재하지 않으면 공장을 호출 할 의 dict 하위 클래스에 불과합니다. defaultdict없이 당신은 사용해야 할 것 :

words = {} 

을하고 루프 :

words.setdefault(key, []).append(word) 

데모 :

귀하의 의견 목록이 정렬 순서는 중요하다
>>> from collections import defaultdict 
>>> raw = ['opst tops', 'opst opts', 'opst pots', 'eip pie', 'eip epi'] 
>>> words = defaultdict(list) 
>>> for entry in raw: 
...  key, word = entry.split() 
...  words[key].append(word) 
... 
>>> [' '.join(v) for v in words.values()] 
['pie epi', 'tops opts pots'] 

경우를 itertools.groupb()을 사용할 수도 있습니다.

from itertools import groupby 

raw = [' '.join(w.split()[1] for w in words) 
     for key, words in groupby(raw, key=lambda e: e.split()[0])] 

데모 :

>>> from itertools import groupby 
>>> [' '.join(w.split()[1] for w in words) 
...  for key, words in groupby(raw, key=lambda e: e.split()[0])] 
['tops opts pots', 'pie epi'] 
1

뭔가처럼 :.

from collections import defaultdict 

d = defaultdict(list) 
for s in raw: 
    sig, val = s.split(' ') 
    d[sig].append(val) 
res = [' '.join(val) for val in d.values()] 

사전을 사용하면 "서명"그들이에 갔다 순서대로 나오지 않을 수 있음을 의미합니다

관련 문제