python中的字母位置

时间:2018-12-07 00:58:30

标签: python

这里的新手...试图编写一个函数,该函数采用字符串并将所有字符替换为其各自的字典值。 这是我所拥有的:

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.

表示仅更改字符串中的最后一个字符。有任何想法吗?任何输入,我们将不胜感激。

4 个答案:

答案 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 libchar to int conversionlist 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. 从字符串模块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())