这里的新手...试图编写一个函数,该函数采用字符串并将所有字符替换为其各自的字典值。 这是我所拥有的:
def alphabet_position(text):
dict = {'a':'1','b':'2','c':'3','d':'4','e':'5','f':'6','g':'7','h':'8':'i':'9','j':'10','k':'11','l':'12','m':'13','n':'14','o':'15','p':'16','q':'17','r':'18','s':'19','t':'20','u':'21','v':'22','w':'23','x':'24','y':'25','z':'26'}
text = text.lower()
for i in text:
if i in dict:
new_text = text.replace(i, dict[i])
print (new_text)
但是当我跑步时:
alphabet_position("The sunset sets at twelve o' clock.")
我得到:
the sunset sets at twelve o' cloc11.
表示仅更改字符串中的最后一个字符。有任何想法吗?任何输入,我们将不胜感激。
答案 0 :(得分:4)
按照逻辑,您需要创建一个new_text
字符串,然后迭代替换其字母。使用您的代码,您一次只能替换一个字母,然后从头开始输入原始字符串:
def alphabet_position(text):
dict = {'a':'1','b':'2','c':'3','d':'4','e':'5','f':'6','g':'7','h':'8','i':'9','j':'10','k':'11','l':'12','m':'13','n':'14','o':'15','p':'16','q':'17','r':'18','s':'19','t':'20','u':'21','v':'22','w':'23','x':'24','y':'25','z':'26'}
new_text = text.lower()
for i in new_text:
if i in dict:
new_text = new_text.replace(i, dict[i])
print (new_text)
并且正如Kevin所建议的那样,您可以使用set
进行一些优化。 (由于他删除了for i in set(new_text):
,因此在此添加了评论)。请注意,这可能仅对大型输入有用。
答案 1 :(得分:1)
由于您的问题通常询问“ Python中的字母位置”,我想我可以用另一种方法来补充已经接受的答案。您可以利用Python's string lib,char to int conversion和list comprehension进行以下操作:
import string
def alphabet_position(text):
alphabet = string.ascii_lowercase
return ''.join([str(ord(char)-96) if char in alphabet else char for char in text])
答案 2 :(得分:0)
您的方法不是很有效。您正在为每个字符重新创建字符串。
您的字符串中有5个e
字符。这意味着replace会被调用5次,即使它实际上只是第一次需要执行任何操作。
还有另一种方法可能更有效。很遗憾,我们无法使用str.translate
,因为它的汇款是one to one replacements。
我们只是迭代输入并逐个字符地产生一个新的字符串。
def alphabet_position2(text):
d = {L: str(i) for i, L in enumerate('abcdefghijklmnopqrstuvwxyz', 1)}
result = ''
for t in text.lower():
result += d.get(t, t)
return result
答案 3 :(得分:0)
这是一种非常简单的列表理解方法。
1:b
而不是b:1
生成这种格式的k:v 导入字符串
def alphabet_position(text):
alphabeths = {v: k for k, v in enumerate(string.ascii_lowercase, start=1)}
return " ".join(str(alphabeths.get(char)) for char in text.lower() if char in alphabeths.keys())