python - 模式计算器 Python

标签 python python-3.x algorithm calculator

我的一个 friend 向我展示了他在面试时遇到的一个编码挑战的有趣问题。因此,您有一个像 n = 3413289830 这样的数字和一个像 p = a-bcdefghij 这样的模式,您需要创建一个接受此输入并输出 -413289827 的函数。显然,它应该适用于数字和字母的任意组合的加法和减法。我编写了这段代码,但我很确定它可以改进,因为我认为它效率有点低。

pattern = 'a-bcdefghij'       
n = '3413289830'
lst = []
def splitnb(n, pattern):
    save = dict()
    if(len(n) != len(pattern) - 1):
        print('Pattern needs to match number')
    else:
        if( '-' in pattern):
            patlst = pattern.split('-')
        elif('+' in pattern):
            patlst = pattern.split('+')
        for char in n:
            a = list(n)
        for pat in patlst:
            first  = patlst[0].split()
            rest = pat.split()
        for l in first[0]:
            f1 = l
            lst.append(f1)
        for l2 in rest[0]:
            f2 = l2
            lst.append(f2)
        save = dict(zip(lst, a))
        nb = ''
        if( '-' in pattern):
            for i in first[0]:
                numb = int(save.get(i))
            for j in rest[0]:
                nb += save.get(j)
                numb1 = numb - int(nb)
        elif('+' in pattern):
            for i in first[0]:
                numb = int(save.get(i))
            for j in rest[0]:
                nb += save.get(j)
                numb1 = numb + int(nb)
    return numb1

f1 = splitnb(n, pattern)
f2 = splitnb('1234', 'ab+cd')
f3 = splitnb('22', 'a-b')

最佳答案

实现此目的的一种方法是采用模式并将每个字符替换为应该存在的数字,然后 eval结果

string.ascii_letters是一个由所有 ascii 字符组成的字符串,按字母顺序排列,以小写字母开头。这可用于将字符转换为应从 n

中提取的数字的索引
>>> [n[string.ascii_letters.index(x)] if x in string.ascii_letters else x for x in pattern]
['3', '-', '4', '1', '3', '2', '8', '9', '8', '3', '0']

我们在 string.ascii_letters else x 中添加 if x ,这样运算符就不会被转换。然后加入结果列表以获取字符串

>>> ''.join(n[string.ascii_letters.index(x)] if x in string.ascii_letters else x for x in pattern)
'3-413289830'

删除括号会将列表理解变成一个性能稍微更高的生成器。然后您可以使用 eval像Python代码一样运行这个字符串

>>> eval(''.join(n[string.ascii_letters.index(x)] if x in string.ascii_letters else x for x in pattern))
-413289827

只有在您信任所提供的输入时才应使用 eval,因为它可以执行任意代码

关于python - 模式计算器 Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59112636/

相关文章:

python - 搜索字符串中的特定情况

python - 如何使用封闭类的类型键入提示方法?

java - 流树转换

algorithm - 使用二进制索引树(Fenwick 树)解决范围最小查询

python - 如何不断检查 JSON 文件是否在 Python 中更新?

python - pygame - 在 event.key 上取消按键

python - Django 休息框架。更新嵌套对象

python-3.x - 无法理解语法href =\“\

python - 在Python中维护集合或列表理解中的序列类型

algorithm - 在位数组中查找缺失的数字