1

さて、ここに来る前に少し調べてみましたが、特に見つけたいものに合ったものは見つかりませんでした。

問題は(少なくとも私にとっては)少し難しいので、ここで説明するために最善を尽くします。

Ok:ユーザーが入力した文字列から取得した文字のリストがあります。

(文字列を入力すると、すべて個別の文字に分割されてリストに追加されます。各文字は独自の「要素」です)

変換先の各文字を「設定」した内容に応じて、このリスト内のすべての文字を別の文字に変換したかったので、これを実行したいと思いました。

私はこれを行う方法について少し混乱しています、私は次のことをした全体のwhileループを持つことができました:

最初の要素を取得し、アルファベット全体と1〜9の数字を実行します。何かに一致した場合は、新しいリストに追加されます。

問題は、これを行うのは本当に非効率的であるように思われることです。私は、彼らがこれを行うためのより良い方法であるに違いないと考えています。私が話していることを以下に投稿します。

コードのフォーマットを正しく機能させることができず、イライラしているだけです。コードは次のとおりです。

print("\t\t\tThe fun encryptor")
print("\n\n Please Enter the following string to be encrypted")
STRING = input("Entry: ")
STRINGCOPY = [STRING]
DIRECTORY = []
#The string is to be encyrypted.
STRINGLEN = len(STRING)
OPPLIMIT = 0
REPEAT = False
DIRECTORYT = []

while OPPLIMIT < STRINGLEN:
    DIRECTORY = DIRECTORY + str.split(STRING[OPPLIMIT])
    OPPLIMIT += 1

# String Added to the Directory necessary
if "a" in DIRECTORY[0]:
    DIRECTORYT += [0.01]
elif "b" in DIRECTORY[0]:
    DIRECTORYT += [0.11]
elif "c" in DIRECTORY:
    DIRECTORYT += [1.11]

    #and so on and so forth

a="0.01"
b="0.11"
c="1.11"
d="0.02"
e="0.22"
f="2.22"
g="0.03"
h="0.33"
i="3.33"
j="0.04"
k="0.44"
l="4.44"
m="0.05"
n="0.55"
o="5.55"
p="0.06"
q="0.66"
r="6.66"
s="0.07"
t="0.77"
u="7.77"
v="0.08"
w="0.88"
x="8.88"
y="0.09"
z="0.99"

ご覧のとおり、これをすべて実行することはほとんど無意味に思えますが、それを行うためのより簡単な方法はありますか?

おそらくfor関数のものを使用していますか?

4

3 に答える 3

2

aまず、b、 などの名前の 26 個の個別の変数を作成する代わりに、次のように作成しdictます。

values = {'a': 0.01,
          'b': 0.11', 
          #...
}

今、あなたはこれを行うことができます:

for letter in DIRECTORY[0]:
    DIRECTORYT += [values[letter]]

または、代わりに:

for letter in values:
    if letter in DIRECTORY[0]:
        DIRECTORYT += [values[letter]]

2 つの違いは、重複の処理方法にあります。そして、どれが欲しいのかわかりません(または、dupがまったくない場合は問題ありません)。アイデアが得られるまで、異なるサンプル データで両方を実行してみてください。

補足として、一般的には次のようにすることをお勧めします。

DIRECTORYT.append(values[letter])

よりも:

DIRECTORYT += [values[letter]]

つまり、必要listがない場合は作成しないでください。

ただし、この場合、ループ全体をリスト内包表記またはジェネレーター式に置き換えることができる場合があります。

DIRECTORYT += [values[letter] for letter in DIRECTORY[0]]
DIRECTORYT += [values[letter] for letter in values if letter in DIRECTORY[0]]

また:

DIRECTORYT.extend(values[letter] for letter in DIRECTORY[0])
DIRECTORYT.extend(values[letter] for letter in values if letter in DIRECTORY[0])

/generator 式バージョンの利点は、extend一時的な s を構築しないことlistです。

于 2013-02-15T23:45:59.377 に答える
1

あなたが何をしようとしているのかよくわかりませんが、ここに2つのアプローチがあります。

文字とその翻訳を含む辞書を設定し、ユーザーが単語を入力したときにこの辞書を検索することができます。

codes = {}
codes['a'] = 9
codes['b'] = 133
# and so on
codes['z'] = 1

user_input = raw_input('Please enter a string: ')

translated_stuff = []

for letter in user_input:
   if letter in codes:
       translated_stuff.append(codes[letter])

# a shorter way to do the above loop is
# translated_stuff = [codes[i] for i in user_input if i in codes]

print "Your translated stuff is : {}".format(''.join(translated_stuff))

または、入力がセットに一致するかどうかを単純に確認したい場合は、次のようにします。

import string

match_list = string.letters + string.digits

user_input = raw_input('Please enter a string: ')
matched_stuff = [i for i in user_input if i in match_list]
于 2013-02-15T23:45:56.500 に答える
0

コードで達成しようとしていたことすべてが私にはわかりませんが、ここでは、入力された文字列の各文字をコードに示されている値に変換する方法を説明します。文字列はすでに文字のシーケンスであり、ほとんどの場合、リスト内のアイテムと同じように扱うことができるため、最初にリストに変換するために変換する必要はありません(主な違いは変更できないことです)。

Pythonディクショナリ(またはdict)を使用して翻訳を保持します。これにより、各文字を検索し、それに関連付けられた値を非常に迅速に見つけることができます。通常、通常のテーブルまたはのすべてのエントリをチェックして検索するよりもはるかに高速ですlist

また、辞書にはアルファベット文字(文字)のみが含まれているため、検索操作ではアルファベット文字(文字)のみが変換され、大文字が小文字に変換されます。

import string

translate = {
    'a': "0.01", 'b': "0.11", 'c': "1.11", 'd': "0.02", 'e': "0.22", 'f': "2.22",
    'g': "0.03", 'h': "0.33", 'i': "3.33", 'j': "0.04", 'k': "0.44", 'l': "4.44",
    'm': "0.05", 'n': "0.55", 'o': "5.55", 'p': "0.06", 'q': "0.66", 'r': "6.66",
    's': "0.07", 't': "0.77", 'u': "7.77", 'v': "0.08", 'w': "0.88", 'x': "8.88",
    'y': "0.09", 'z': "0.99",
}

print("\t\t\tThe fun encryptor")
print("\n\nPlease type in a string to be encrypted and press the Enter key")
entry = input("Entry: ")

directory = [translate[ch.lower()] for ch in entry if ch in string.ascii_letters]

print('directory:', directory)
于 2013-02-16T00:34:46.877 に答える