【问题标题】:Create a function in python, which given an integer returns a string. For example:- 1 maps to a, 26 to z, 27 to aa, 50 to ax在python中创建一个函数,给定一个整数返回一个字符串。例如:- 1 映射到 a,26 映射到 z,27 映射到 aa,50 映射到 ax
【发布时间】:2021-07-22 23:44:34
【问题描述】:

我想在 python 中创建一个函数。该函数将接受一个整数并返回一个字符串。 映射规则可以通过一些例子来解释,如下所示:-

示例 1 个映射到“a”,26 个映射到“z”,27 个映射到“aa”,50 个映射到“ax”,70 个映射到“br”

顺序是 - a、b、c、d 到 z、aa、ab、ca 到 zz、aaa、aab、aac 到 zzz。

我能够创建这个函数:-

from string import ascii_lowercase
import itertools

def func(n):
    c = 0
    l = []
    for size in itertools.count(1):
        for s in itertools.product(ascii_lowercase, repeat=size):
            l.append(s)
            c+=1
            if c == n:
                return l

编辑:解决方案

非常感谢大家的帮助。 我想出了一个解决问题的办法:

d = { n-96:chr(n) for n in range(97,123) }

def div(n):
    if ((n%26) == 0 and n>26):
        return func(n//26 - 1)
    elif (n//26) <= 0:
        return ''
    elif n == 26:
        return 'z'
    elif (n//26) in d:
        return d[n//26]
    else:
        return func(n//26)

def mod(n):
    if n<=0:
        return ''
    elif ((n%26) == 0 and n>26):
        return 'z'
    elif (n%26)<=0:
        return ''
    else:
        return d[n%26]

def func(n):

    res_div = div(n)
    res_mod = mod(n)
    return (res_div + res_mod)

【问题讨论】:

  • 规则不举例说明。如果您对规则的理解不够好,无法严格定义它,那么您就不可能提出解决方案。
  • 你应该首先展示你尝试过的东西,而不是仅仅要求别人回答,不费吹灰之力
  • SO 不是为您做作业的服务 - 请在此处查看How to ask
  • @batman567,我知道 SO 不是为我的家庭作业提供解决方案的服务。我尝试解决问题,但无法提出优化的解决方案。你不应该假设任何事情。 Jakub Doka 也是如此
  • 您确定70 映射到'be'?根据你的描述,不包括'be',映射的值应该是57,因为'be'是你描述的序列中'ax'之后的7个元素。

标签: python python-3.x function


【解决方案1】:

尝试实现这样的东西。假设我们有 28。我们执行 28//26 并得到 2。然后我们执行 28//26 并得到第一个数字 1。所以我们将它映射到像 12 这样的数字(26 代表十位)。然后我们拆分数字,任何带有 1 的都被替换为 a,任何带有 2 的都被替换为 b,依此类推。

【讨论】:

    【解决方案2】:

    重要的是要了解这个问题从根本上将数字转换为不同的基数。 n的值不用数,可以计算。这是从 base26 到 base10 完成的,与将 base2 转换为 base 10 的过程相同。

    考虑将二进制数1010 转换为十进制,假设最左边的数字是最重要的。从最右边的数字开始,将每个数字乘以 2 的递增幂得到的值相加。0*2^0 + 1*2^1 + 0*2^2 + 1*2^3 = 0 + 2 + 0 + 8 = 10。这可能会得到验证:

    int("1010", 2)
    

    因此,针对您的问题执行此操作的步骤是:

    1. 将 a、b、...、z 映射到 intS 1、2、...、26
    2. 反向n
    3. 执行计算
    def convert_abc_to_dec(abc):
        import string
        a_to_i_map = {c: i+1 for i, c in enumerate(string.ascii_lowercase)}
        return sum(a_to_i_map[x]*(26**i) for i, x in enumerate(n[::-1]))
    

    【讨论】:

      【解决方案3】:

      非常感谢大家的帮助。 我想出了一个解决问题的办法:

      d = { n-96:chr(n) for n in range(97,123) }
      
      def div(n):
          if ((n%26) == 0 and n>26):
              return func(n//26 - 1)
          elif (n//26) <= 0:
              return ''
          elif n == 26:
              return 'z'
          elif (n//26) in d:
              return d[n//26]
          else:
              return func(n//26)
      
      def mod(n):
          if n<=0:
              return ''
          elif ((n%26) == 0 and n>26):
              return 'z'
          elif (n%26)<=0:
              return ''
          else:
              return d[n%26]
      
      def func(n):
      
          res_div = div(n)
          res_mod = mod(n)
          return (res_div + res_mod)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-01-23
        • 1970-01-01
        • 2013-09-26
        • 2013-09-26
        • 1970-01-01
        • 2013-11-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多