【问题标题】:Alphabet position in pythonpython中的字母位置
【发布时间】:2019-05-08 18:22:36
【问题描述】:

这里的新手...尝试编写一个函数,该函数接受一个字符串并将所有字符替换为它们各自的字典值。 这是我所拥有的:

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.

意味着它只改变字符串中的最后一个字符。有任何想法吗?非常感谢任何输入。

【问题讨论】:

  • new_text 不断被最新结果替换。
  • 您在每次迭代时创建一个新变量,在循环完成时,除了最后一个变量之外的所有变量都将被丢弃。

标签: python


【解决方案1】:

这是一种非常简单的列表理解方法。

  1. 从字符串模块以这种格式生成 k:v,1:b 而不是 b:1

导入字符串

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

【讨论】:

    【解决方案2】:

    您的方法效率不高。您正在为每个字符重新创建字符串。

    您的字符串中有 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】:

      由于您的问题通常是关于“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])
      

      【讨论】:

        【解决方案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):)请注意,这可能仅对大量输入有益...

        【讨论】:

        • 我在发布和编辑时没有看到这个答案。刚刚删除了我的并投票给你的
        猜你喜欢
        • 1970-01-01
        • 2017-09-27
        • 2017-05-16
        • 2017-04-21
        • 1970-01-01
        • 2021-03-30
        • 2016-08-15
        • 2011-08-21
        • 2016-10-20
        相关资源
        最近更新 更多