我的一个 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/