1

好吧,我来这里之前做了一些研究,我没有找到任何特别适合我想要找到的东西。

这个问题有点困难,(至少,对我来说)所以我会尽力在这里解释它。

好的:所以我有一个字母列表,这些字母取自用户输入的字符串。

(他们输入一个字符串,然后将其全部分解为单个字母并添加到一个列表中,其中每个字母都是它自己的“元素”)

现在我想这样做是因为我想让这个列表中的所有字母都被翻译成别的东西,这取决于我“设置”每个字母要翻译成什么。

我对如何做到这一点有点困惑,我可以有一个完整的 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

首先,不要创建 26 个名为a,b等的单独变量,只需创建一个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]]

两者之间的区别在于它们如何处理重复项。而且我不确定你想要哪一个(或者,如果你从来没有任何重复,所以没关系)。尝试使用不同的样本数据执行这两种方法,直到你明白这一点。

作为旁注,通常最好这样做:

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再次在于它们不构建临时lists。

于 2013-02-15T23:45:59.377 回答
1

不太确定您要做什么,但这里有两种方法。

您可以设置一个包含字母及其翻译的字典,然后在您的用户输入单词时在该字典上进行查找。

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 回答