0

機能しないアナグラム解決アルゴリズムを作成しました。

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

\n を取り除くには len(word) - 1 を使用する必要がありました。

4

2 に答える 2

7

(1) 最初のループの "len(word)-1" の "-1" がわかりません。

(2) 2 番目のループにはいくつかの問題があります。

文字が同じかどうかを確認するのではなく、アナグラムの各文字が単語に含まれているかどうかを確認します。カウント情報を使用していないため、ブックとブックを区別できません。また、反復しているシーケンスから削除しているため、予期しない動作が発生します。

私の側では、単に使用します

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

明示的な for ループではなく。

単語の並べ替えは一種の正規化プロセスであることに注意してください。相互のアナグラムである 2 つの単語が同じ形式になるようにします。2 つのものがアナグラムかどうかを判断する別の方法は、文字数が同じであることを確認することです。

>>> 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
于 2012-01-14T18:51:13.003 に答える
1

コメントで述べたように、私に飛び出す2つの悪は次のとおりです。

  1. なぜ: if 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. リスト反復
  2. for..else
于 2012-01-14T19:02:36.310 に答える