【问题标题】:How can I 'translate' elements from a 'list' to those in another 'list' in Python?如何在 Python 中将元素从“列表”“翻译”到另一个“列表”中的元素?
【发布时间】:2013-02-15 23:36:31
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • 呃,它不显示截图:这是链接:i1267.photobucket.com/albums/jj554/owatch/…
  • 将代码发布为文本(例如 pastebin.com)比屏幕截图更有帮助。我们无法复制并粘贴屏幕截图并尝试自己运行。
  • @user1883304 您可以通过 DIRECTORY=list(STRING) 将字符串转换为列表。
  • 另外,你真的不应该给你的变量全大写这样的名字;它使阅读您的代码变得非常困难。有关详细信息,请参阅PEP 8
  • @Mike:他的代码的哪一部分让你认为他需要list 的字符?

标签: python list compare matching


【解决方案1】:

首先,不要创建名为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 表达式版本的优势再次在于它们不会构建临时的lists。

【讨论】:

  • 它不起作用,当我让它打印目录时,我总是得到一个空白结果
  • @Owatch:请显示代码(在 pastebin.com 之类的地方)并说明您在哪里“打印 [ing] 目录”。很多人已经弯腰试图在这里读懂你的想法,但显然 X 教授没有用。
【解决方案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]

【讨论】:

  • 嘿,我尝试过使用你的方式,但我没有使用 translate_stuff.append(codes[letter]) 而使用 COUNTLIMIT = len(User_input) while x != COUNTLIMIT: for letter in User_input [x]: if letter in TRvalues: Tdirectory += TRvalues[User_input[x]] x = x + 1 但我不断收到错误消息:'float' object is not iterable
  • 对不起,我无法让这段代码正常工作。好烦
  • 你为什么要那样做?
  • @Owatch:如果您尝试了完全不同的代码并且完全不同的代码不起作用,为什么不试试 Burhan Khalid 的 实际 代码?如果您想知道为什么会收到 TypeError,您必须向我们展示完整的回溯,并告诉我们其他变量的来源。 (我的猜测是 User_input 是一个浮点数或浮点数列表,但我不知道为什么,因为您没有显示创建它的代码。也许您使用的是 Python 2.x 并更改了他的 @987654325 @ 到 input 还是?)
【解决方案3】:

我不清楚您试图在代码中完成的所有工作,但这里如何将输入的字符串的每个字符转换为代码中显示的值。无需先将其转换为列表,因为字符串已经是一个字母序列,在大多数情况下可以将其视为列表中的项目(主要区别在于它们不能更改)。

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

【讨论】:

  • input() 如果你使用的是 Python 3.x,否则 raw_input()
  • @BurhanKhalid:OP 在他的原始代码中使用inputprint 作为函数等,所以希望他使用的是 3.x。但是,考虑到他的其他 cmets,可以想象他正在使用 2.x 但遵循 3.x 教程,所以这可能是一个有用的评论......
  • @abarnert:我的印象是 OP 使用的是 3.x,所以相应地调整了我的答案——从没想过你提到它们的可能性。哦,好吧,到目前为止没有任何回应,他们似乎并不担心任何一种方式。
  • @martineau:是的,我有同样的印象,这就是为什么我一开始就说“否则raw_input()”评论是不必要的……但后来我意识到他有一个float他期望在一些看不见的代码中出现str,似乎调用input...
  • @martineau:另外,OP 已经回应了其他两个答案,基本上是说“我尝试了一些与您提供的代码不同的代码,但它不起作用以某种未指定的方式”,然后在他的问题中添加“我现在有一个新问题......”。也许“新问题”是狼獾正在吃他的路由器,这就是为什么他从那以后再也没有回答过?
猜你喜欢
  • 1970-01-01
  • 2020-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-29
  • 2020-05-06
  • 1970-01-01
相关资源
最近更新 更多