python - 有没有更快的方法将数字转换为名称?

标签 python namespaces converter

以下代码定义了一系列映射到数字的名称。它旨在获取一个数字并检索一个特定的名称。该类通过确保名称存在于其缓存中来运行,然后通过索引到其缓存中返回该名称。这其中的问题:如何在不存储缓存的情况下根据数字计算名称?

除了第一个数字总是以 53 为基数之外,名称可以被认为是一个 63 进制数。

class NumberToName:

    def __generate_name():
        def generate_tail(length):
            if length > 0:
                for char in NumberToName.CHARS:
                    for extension in generate_tail(length - 1):
                        yield char + extension
            else:
                yield ''
        for length in itertools.count():
            for char in NumberToName.FIRST:
                for extension in generate_tail(length):
                    yield char + extension

    FIRST = ''.join(sorted(string.ascii_letters + '_'))
    CHARS = ''.join(sorted(string.digits + FIRST))
    CACHE = []
    NAMES = __generate_name()

    @classmethod
    def convert(cls, number):
        for _ in range(number - len(cls.CACHE) + 1):
            cls.CACHE.append(next(cls.NAMES))
        return cls.CACHE[number]

    def __init__(self, *args, **kwargs):
        raise NotImplementedError()

以下交互式 session 显示了一些预期按顺序返回的值。

>>> NumberToName.convert(0)
'A'
>>> NumberToName.convert(26)
'_'
>>> NumberToName.convert(52)
'z'
>>> NumberToName.convert(53)
'A0'
>>> NumberToName.convert(1692)
'_1'
>>> NumberToName.convert(23893)
'FAQ'

不幸的是,这些数字需要映射到这些确切的名称(以允许反向转换)。


请注意:可变数量的比特被接收并明确地转换成一个数字。此数字应明确转换为 Python 标识符命名空间中的名称。最终,有效的 Python 名称将被转换为数字,这些数字将被转换为可变位数。


最终解决方案:

import string

HEAD_CHAR = ''.join(sorted(string.ascii_letters + '_'))
TAIL_CHAR = ''.join(sorted(string.digits + HEAD_CHAR))
HEAD_BASE, TAIL_BASE = len(HEAD_CHAR), len(TAIL_CHAR)

def convert_number_to_name(number):
    if number < HEAD_BASE: return HEAD_CHAR[number]
    q, r = divmod(number - HEAD_BASE, TAIL_BASE)
    return convert_number_to_name(q) + TAIL_CHAR[r]

最佳答案

这是一个充满 1 个错误的有趣小问题。

没有循环:

import string

first_digits = sorted(string.ascii_letters + '_')
rest_digits = sorted(string.digits + string.ascii_letters + '_')

def convert(number):
    if number < len(first_digits):
        return first_digits[number]

    current_base = len(rest_digits)
    remain = number - len(first_digits)
    return convert(remain / current_base) + rest_digits[remain % current_base]

和测试:

print convert(0)
print convert(26)
print convert(52)
print convert(53)
print convert(1692)
print convert(23893)

输出:

A
_
z
A0
_1
FAQ

关于python - 有没有更快的方法将数字转换为名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11052808/

相关文章:

python - Django Forms - 在提交时指定 ModelForm 模型?

php - PSR-4 命名空间(我做对了吗?)

c++ - 在 C++ 中转发声明一个隐藏的 typedef

c++ - 在数学上添加两个字符串?

java - JSF 2.0 : <f:viewParam> and default converters

python - 如何使用 pyqt QFileDialog 将图像上传到 sqlite 数据库?

python - mnlogit 回归,奇异矩阵误差

python - divmod() : 'str' and 'int' when formatting a SQL result 不支持的操作数类型

java - 传统文件夹层次结构中的 TypeScript 类

c++ - 如何将字符串转换为 vector