如何将元素从“列表”转换为Python中另一个“列表”中的元素?

时间:2013-02-15 23:36:31

标签: python list compare matching

好吧,在我来到这里之前,我做了一些研究,但我没有发现任何能满足我想要的东西。

问题有点困难,(至少对我而言)所以我会尽力在这里解释一下。

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

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

现在我想这样做是因为我希望将此列表中的所有字母翻译成其他字母,具体取决于我为每个要翻译的字母“设置”的内容。

关于如何做到这一点,我有点困惑,我可以有一个完整的循环,执行以下操作:

取第一个元素,然后运行整个字母并按数字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函数?

3 个答案:

答案 0 :(得分:2)

首先,不要创建名为ab等的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]]

两者之间的区别在于它们如何处理重复。我不确定你想要哪一个(或者,如果你从来没有任何重复,那么无所谓)。尝试使用不同的样本数据执行两者,直到您明白为止。

作为旁注,通常做得更好:

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])

extend / generator表达式版本的优点是,它们不会构建临时list

答案 1 :(得分: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]

答案 2 :(得分:0)

我不清楚你在代码中想要完成的所有事情,但是这里如何将输入的字符串中的每个字符翻译成代码中显示的值。没有必要转换为首先将其转换为列表,因为字符串已经是一个字母序列,在大多数情况下可以像列表中的项目一样对待(主要区别在于它们无法更改)。 / p>

它使用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)