2012-01-14 3 views
0

나는 작동하지 않는 anagram solve 알고리즘을 작성했습니다.Anagram 해결 오류 python

for word in wordlist: #Checking for equal length 
    if sorted(word.replace("\n", "")) == sorted(anagram): 
     possible.append(word) 

len (word) - 1을 사용하여 \ n을 (를) 제거해야했습니다.

+0

사이드 포인트,하지만 당신은 왜에서 1을 뺀된다 'len (단어)'? – voithos

+0

시퀀스를 반복하는 동안 시퀀스를 수정하는 것은 좋지 않을 것입니다 ... –

+0

"단어의 문자가 다른 단어로 전달되면 ...", 간단하게 변경할 수 없습니까? – BlackBear

답변

7

(1) 첫 번째 루프에서 "len (word) -1"의 "-1"을 이해하지 못합니다.

(2) 두 번째 루프는 몇 가지 문제가있다 : 그것은 문자가 동일 여부를 확인하지 않습니다

, 그것은 철자 바꾸기의 각 문자 단어에 있는지 여부를 확인합니다. 조사 정보를 사용하지 않으므로 복과 책을 구별 할 수 없습니다. 또한 반복되는 시퀀스에서 제거되므로 예기치 않은 동작이 발생합니다.

제의 경우 단순히

sorted_anagram = sorted(anagram) 
possibles = [word for word in wordlist if sorted(word) == sorted_anagram] 

보다는 루프에 대한 명시 적 사용하십시오.

단어 정렬은 일종의 정규화 과정이므로 서로의 아나그램 인 두 단어가 같은 형식으로되어 있는지 확인합니다. 또 다른 방법은 두 가지가 아나그램은 문자 카운트가 동일한 지 확인하는 것입니다 여부를 확인하는 방법 : 코멘트에서 언급 한 바와 같이

>>> from collections import Counter 
>>> Counter('book') 
Counter({'o': 2, 'k': 1, 'b': 1}) 
>>> Counter('obko') 
Counter({'o': 2, 'k': 1, 'b': 1}) 
>>> Counter('bok') 
Counter({'k': 1, 'b': 1, 'o': 1}) 
>>> 
>>> Counter('book') == Counter('boko') 
True 
>>> Counter('book') == Counter('bok') 
False 
+1

스마트, 정렬 된 단어를 비교합니다. 아나 그램과 단어 모두에 대해'word.lower()'를 사용하고 싶다면 사전에 단어를 어디에서 가져 왔는지에 따라 달라질 수 있습니다. – voithos

1

나 뛰어 두 악은 다음과 같습니다

  1. 이유 : len (word) - 1 == len (anagram)입니까?
  2. 반복하면서 목록을 줄이는 것은 큰 일이 아닙니다. 그 줄 possible.remove(word)을 변경해야합니다.

어떻게 이런 일에 대해 : 사용 도구에

anagramLength = len(anagram) # Get the value once to save CPU 
possible1 = [word for word in wordlist if len(word)-1 == anagramLength] # List iteration 
possible2 = [] # Make a new list that will be more constricted 
for word in possible: #Checking for same letters 
    for letter in anagram: 
     if letter not in word: 
      break 
    else: 
     possible2.append(word) # Only called if you don't break the above for loop 

참고 :

  1. listIteration
  2. for..else
+1

'len()'은 [O (1) 작업]입니다 (http://stackoverflow.com/questions/699177/python-do-python-lists-keep-a-count-for-len-or-does- it-count-for-each-call). 이를 로컬 변수에 저장할 필요가 없습니다. – voithos

+2

@voithos는 전혀 따르지 않습니다. O (1)은 목록의 길이와 관련이없는 일정한 시간을 의미합니다. 비용이 많이 들지 않거나 지역 변수를 얻는 것이 더 저렴하지 않다는 것을 의미하지는 않습니다. –

+0

나는 간단한 테스트를했고 len을 var에 저장했다는 것을 발견했을 때 매번 len을 계산할 때 평균 1.7 초보다 1.2 초가 더 많이 걸렸다. (wordList는 나의 테스트에서 76 개의 항목을 썼고, 나는 그것을 100,000 번 필터링했다) – matiu