2

最近/usr/share/dict/words、自分のメソッドを使用してパリンドロームのリストを循環して返すメソッドをispalindrome(x)作成しました。ここにコードの一部を示します...何が問題になっていますか?10分間停止してから、ファイル内のすべての単語のリストを返します。

def reverse(a):
    a[::-1]を返します

def ispalindrome(a):
    b = reverse(a)
    b.lower()== a.lower()の場合:
        Trueを返す
    そうしないと:
        Falseを返します

wl = open('/ usr / share / dict / words'、'r')
ワードリスト=wl.readlines()
wl.close()
ワードリストのxの場合:
    ispalindrome(x)でない場合:
        wordlist.remove(x)
ワードリストを印刷する
4

5 に答える 5

8
wordlist = wl.readlines()

これを行うと、最後に改行文字があるため、リストは次のようになります。

['eye\n','bye\n', 'cyc\n']

その要素は明らかに回文ではありません。

あなたはこれを必要とします:

['eye','bye', 'cyc']

したがってstrip、改行文字とそれは問題ないはずです。

これを1行で行うには:

wordlist = [line.strip() for line in open('/usr/share/dict/words')]

編集:リストを繰り返して変更すると、問題が発生します。Matthewが指摘したように、リスト内包表記を使用します。

于 2011-01-12T07:50:40.623 に答える
3

2つの問題があると思います。

まず、すべての単語をリストに読み込むことのポイントは何ですか?回文の場合は、各単語を順番に処理して印刷してみませんか。

次に、空白に注意してください。それぞれの最後に改行がありますword

(空白のために)パリンドロームを識別していないため、リストからすべてのアイテムを削除しようとします。あなたがそれを繰り返している間!

このソリューションは1秒以内に実行され、多くの回文を識別します。

for word in open('/usr/share/dict/words', 'r'):
    word = word.strip()
    if ispalindrome(word):
        print word

編集

おそらくもっと「pythonic」はジェネレータ式を使用することです:

def ispalindrome(a):
    return a[::-1].lower() == a.lower()

words = (word.strip() for word in open('/usr/share/dict/words', 'r'))
palindromes = (word for word in words if ispalindrome(word))
print '\n'.join(palindromes)
于 2011-01-12T07:56:37.410 に答える
3

他の人はすでにより良い解決策を指摘しています。コードを実行した後、リストが空にならない理由をお見せしたいと思います。他の回答で言及されている「改行の問題」のために関数が戻ることはないため、コードはすべての項目を呼び出しispalindrome()ます。では、なぜリストは最後に空ではないのですか?Truewordlist.remove(x)

リストを繰り返し処理しているときにリストを変更しているからです。次のことを考慮してください。

>>> l = [1,2,3,4,5,6]
>>> for i in l:
...     l.remove(i)
...
>>> l
[2, 4, 6]

を削除する1と、残りの要素が1ステップ上に移動するため、現在l[0]2です。ただし、反復カウンターは進んでl[1]おり、次の反復で確認されるため、削除3などが行われます。

したがって、コードはエントリの半分を削除します。道徳:リストを繰り返し処理している間は、リストを変更しないでください(何をしているのかを正確に理解している場合を除きます:))。

于 2011-01-12T08:15:16.543 に答える
2

すべての単語が返されるわけではありません。半分を返します。これは、リストを繰り返しながら変更しているためです。これは間違いです。より単純でより効果的な解決策は、リスト内包表記を使用することです。スクビルを変更して、すべてを行うことができます。

[word for word in (word.strip() for word in wl.readlines()) if ispalindrome(word)]

これを分割することもできます:

stripped = (word.strip() for word in wl.readlines())
wordlist = [word for word in stripped if ispalindrome(word)]
于 2011-01-12T07:59:09.490 に答える
1

の各単語の最後に改行を含めます/usr/share/dict/words。つまり、回文は見つかりません。リストから非パリンドロームを削除するのではなく、パリンドロームを見つけたときにログに記録するだけで、処理が高速化されます。

于 2011-01-12T07:49:40.183 に答える