1

大学でのコースの一環として、Pythonを学んでいます。私が成し遂げようとしている仕事は、「反国教会廃止主義」におけるランダムな文字とそれに対応する位置を印刷するプログラムを書くことです。その後、残りの文字を1行に印刷します。

私はおそらくクレイジーで奇妙な回り道でこれを行おうとしています-選択した値をリストに入力し、これらの文字を元の文字から削除します。

私のプログラムはおそらくすべて間違っていて壊れていることに気づきました。私は今日だけリストを学び始めました!

import random
word = "antidisestablishmentarianism"
wordList =["antidisestablishmentarianism"]

print("The Word is:",word,"\n")

lengthWord = len(word)
usedValues=[]
for i in range(5):
    position = random.randrange(0,lengthWord)
    print("word[",position, "]\t", word [position])
    usedValues=[position]
for ch in wordList:
    wordList.remove([usedValues])
print("The remaining letters are",WordList, sep='')
4

2 に答える 2

2

worldList問題の一部は、リストとusedValuesリストを正しく作成および操作していないことにあると思います。

を使用して文字のリストを作成しwordListますlist(word)usedValues使用するインデックスを追加するにはusedValues.append(position)。単語リストから使用済みの値を削除する方法にも問題があります。

これらのエラーが修正されたコードは次のとおりです。

import random
word = "antidisestablishmentarianism"
wordList = list(word)

print("The Word is:",word,"\n")

lengthWord = len(word)
usedValues=[]
for i in range(5):
    position = random.randrange(0,lengthWord)
    print("word[",position, "]\t", word[position])
    usedValues.append(position)

for index in usedValues:
    wordList.pop(index)

print("The remaining letters are",WordList, sep='')

これはほとんどうまくいきます。ただし、まだ論理エラーがあります。最初のループで同じランダムな位置を 2 回取得すると、毎回同じ文字が報告されます。ただし、後でリストからそれらを削除すると、2 つの異なる文字がポップされることになります。同様に、単語の先頭近くから文字を削除すると、後で削除するインデックスが正しくなくなります。IndexError選択された最後の位置の 1 つが単語の終わり近くにあった場合でも、 を取得できます。

修正の 1 つは、最初のループ内で、選択した値をリストからすぐに削除することです。次に、各サイクルを明示的に呼び出す必要がありますlen(毎回変更されるため) が、それ以外はすべて正しく機能するはずです。

または、ここで問題を解決する方法を示します。5 つの特定のインデックスを選択してリストから削除する代わりにrandom.shuffle、すべてのインデックスのリストを作成して最初の 5 つを取得します。残りは、ランダムな順序で印刷するか、最初に並べ替えて、元の単語から文字が削除されたような印象を与えることができます。

import random
word = "antidisestablishmentarianism"

indexes = list(range(len(word)))
random.shuffle(indexes)

for i in indexes[:5]:
    print("word[%d] is '%s'" % (i, word[i]))

rest = sorted(indexes[5:]) # or just use indexes[5:] to keep random order
print("The remaining letters are '%s'" % "".join(word[i] for i in rest))
于 2012-11-08T19:51:07.910 に答える
0

現状のコードにはいくつかの問題があります。まず、この行:

wordList =["antidisestablishmentarianism"]

あなたが思うことをしません-それは実際に単一のアイテムを含むリストを作成します"antidisestablishmentarianism"。文字列を文字のリストに変換するには、list()-を使用できます。すでに変数を持っているのでword、単語を再入力する必要はありません。

ちなみに、wordListこれはあまり良い変数名ではありません。よりpythonicのunderscore_separatedスタイルではなくcamelCaseを使用しているという事実とは別に、ここで実際に必要なのは、単語内の文字のリストです。

したがって、その行は次のように置き換えることができます。

characters = list(word)

次に進む...この行:

lengthWord = len(word)

冗長です-コード内で一度だけ参照lengthWordするので、その参照を使用する場所に置き換えるだけでもかまいませんlen(word)

あなたのライン:

    usedValues=[position]

また、あなたが思っていることをしていません。それは、ループ内の最新の位置のみを含むリストに完全に置き換えられています。 usedValuesリストに値を追加するには、次を使用しますlist.append()

    used_positions.append(position)

(変数にもっと正確な名前を付けました)。次の問題はこのブロックです:

for ch in wordList:
    wordList.remove([usedValues])

まず、単語内の各文字ではなく、以前に保存した各位置を確認する必要があります。の使用法list.remove()も間違っています。そのように削除する値のリストを指定することはできませんが、とにかくlist.remove()リストから値の最初のインスタンスを削除します。必要なのは、特定の位置にあるアイテムを削除することです。目的はlist.pop()次のとおりです。

for position in sorted(used_positions, reverse=True):
    characters.pop(position)

used_positionsアイテムを削除するときに、の残りの位置が[*]の残りの位置とずれused_positionsないように、逆に並べ替えられたコピーを使用しています。characters

最後の問題は最後の行です。

print("The remaining letters are",WordList, sep='')

リストの内容をで区切って印刷したい場合''、これはそれを行う方法ではありません。代わりに、次のものが必要ですstr.join()

print("The remaining letters are", "".join(characters))

これらの変更をすべて実践し、少し整理すると、次のようになります。

import random
word = "antidisestablishmentarianism"
characters = list(word)

print("The Word is:", word, "\n")

used_positions = []

for i in range(5):
    position = random.randrange(0, len(word))
    print("word[",position, "]\t", word[position])
    used_positions.append(position)

for position in sorted(used_positions, reverse=True):
    characters.pop(position)

print("The remaining letters are", "".join(characters))

[*]実際、これは別の問題を引き起こします。コードが同じ位置を2回選択した場合はどうなるでしょうか。私はあなたにそれについて考えさせます。

于 2012-11-08T20:15:39.660 に答える