1

秘密のコーディング プログラムを作成しようとしていますが、for ループに問題があります (完全に理解したことがありません)。これが私がしなければならないことです。ユーザーの入力を取得し、ユーザーのテキストの各単語をコード化されたテキストに変換しようとしています。そのため、誰かが「hello」と入力すると、「vpyyl」になります。誰か助けてくれませんか?これは可能ですか?

これは私がこれまでに持っているもので、「リストのインデックスは str ではなく整数でなければなりません」というエラーが表示されます。forループの設定も間違っていると確信しています。

import random

list = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']
codedList = ['s', 'q', 'n', 'z', 'p', 'o', 'k', 'v', 'm', 'c', 'i', 'y', 'w', 'a', 'l', 't', 'd', 'r', 'j', 'b', 'f', 'e', 'h', 'u', 'x', 'g']

text = input("Enter your text: ")

for i in [text]:
    i = codedList[i]
    print[i]
4

6 に答える 6

7

には 1 つの項目しかありません[text]: ユーザーが入力した文字列全体です。おそらく、文字列の各文字にfor i in text:どれが設定されるかが必要です。i

また、リストに名前を付けましたlist(つまり、組み込みの name にアクセスできなくなりましたlist)。また、リストは整数でインデックス付けされますが、文字列で要素にアクセスしようとしています。おそらく、そのために辞書を使用して、各文字をコード化された同等のものにマッピングすることをお勧めします。

他のいくつかの問題は、文字以外の何か (スペース、句読点) が入力され、文字がすべて小文字である状況を処理するコードがないことです。最後に、呼び出しで括弧の代わりに角括弧を使用してprintおり、改行を抑制していません。

そう:

code = dict(a='s', b='q', c='n', d='z', e='p', f='o', g='k', h='v', i='m', j='c',
            k='i', l='y', m='w', n='a', o='l', p='t', q='d', r='r', s='j', t='b',
            u='f', v='e', w='h', x='u', y='x', z='g')

# another way to define the dictionary (you don't need both)
alphabet      = "abcdefghijklmnopqrstuvwxyz"
codedalphabet = "sqnzpokvmciywaltdrjbfehuxg"
code          = dict(zip(alphabet, codedalphabet))

# add upper-case versions of all letters to dictionary
for letter, codedletter in code.iteritems():
    code[letter.upper()] = codedletter.upper()

for char in input("Enter your text: "):
    if char in code:
        print(code[char], end="")
    else:
        print(char, end="")    # not an alphabetic character, print as-is
print()                        # we haven't printed a line break; do so now

他の人が指摘しているように、Python にはこれを簡単にするいくつかの機能が組み込まれていますが、forループに問題がある場合、それは学習の助けにはなりません。:-)

于 2012-08-23T04:23:58.593 に答える
4

Pythonでは、プログラミングを開始する前に、同じことを行う組み込み関数があるかどうかを確認してください。確率90%であります。

chars = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']
coded = ['s', 'q', 'n', 'z', 'p', 'o', 'k', 'v', 'm', 'c', 'i', 'y', 'w', 'a', 'l', 't', 'd', 'r', 'j', 'b', 'f', 'e', 'h', 'u', 'x', 'g']

table = str.maketrans(chars, coded)
coded_text = text.translate(table)

print (coded_text)

ドキュメント: 翻訳| maketrans

于 2012-08-23T07:31:35.427 に答える
2

やろうとしていることを達成するためのさまざまな方法があります。ただし、既に開始しているものと現在のコード (読みやすさ/明確さのために一部の識別子を変更) に焦点を当てると、次のようになります。

clearList = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']
codedList = ['s', 'q', 'n', 'z', 'p', 'o', 'k', 'v', 'm', 'c', 'i', 'y', 'w', 'a', 'l', 't', 'd', 'r', 'j', 'b', 'f', 'e', 'h', 'u', 'x', 'g']

text = input("Enter your text: ")

-loopforは次のようになります。

for letter in text:            # iterate over the text not [text]
   idx = clearList.index(letter)  # find the index for the given letter in clearList
   print(codedList[idx], end="")  # get the corresponding coded letter with the index

となり、結果は になりvpyylます。

リストを識別子として使用することはお勧めできません。Pythonでは、データ構造の名前としてすでにリストが使用されています。letterまた、あなたの入力に対して、よりわかりやすい識別子を使用しました

--

for-loops に問題があると述べたので、Python Wikiからの 2 つのチュートリアルと、この 1 つの形式のtutorialspointを次に示します。

于 2012-08-23T04:24:05.320 に答える
2
for i in [text]:

する必要があります

for i in text:

あなたの場合、iユーザーが入力した文字列の文字です..

インデックスとして機能するには整数でなければなりません

あなたが意図するコードは次のようになるはずです..

注:入力の代わりに raw_input を使用しました。入力はevalユーザー入力を試行するため、最終的にNameErrorエラーが発生します

In [214]: import random

In [215]: mylist = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']

In [216]: codedList = ['s', 'q', 'n', 'z', 'p', 'o', 'k', 'v', 'm', 'c', 'i', 'y', 'w', 'a', 'l', 't', 'd', 'r', 'j', 'b', 'f', 'e', 'h', 'u', 'x', 'g']

In [217]: text = raw_input("Enter your text: ")
Enter your text: hello

In [218]: str = []

In [219]: for i in text:
   .....:     j = mylist.index(i)
   .....:     str.append(codedList[j])
   .....:

In [220]: ''.join(str)
Out[220]: 'vpyyl'

についてはfor loop、テキストに「hello」という単語が含まれています。ここでの for ループは、テキスト内のすべての文字を反復します。つまり、最初の反復は「h」、次に「e」などになります。

listこの名前は python のキーワードであるため、リストの名前は であってはなりません

于 2012-08-23T04:21:25.727 に答える
1

2 つの問題:

  1. i反復変数として、およびエンコードされた値を保持するために使用しています。これは無害ですが、悪い習慣です。
  2. 1 つの要素としてテキストを含む単一要素の配列を反復処理しています。[]周囲を削除しますtext

    for i in text:
        print codedList[i]
    
于 2012-08-23T04:23:15.813 に答える
1

文字列を別のアルファベットでエンコードしようとしていると思います。

あなたのコードでは、

for i in [text]:
    i = codedList[i]
    print[i]

.index() を使用して、元のリストの「i」のインデックスを見つける必要があります。以下のような実行可能なリビジョン コード。

for i in text:
    index = list.index(i)
    i = codedList[index]
    print [i]
于 2012-08-23T04:30:46.387 に答える