[我有一个朋友向我展示了他在一次采访中遇到的关于编码挑战的有趣问题。因此,您有一个像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
结果
eval
是按字母顺序从小写字母开始的所有ascii字符的字符串。这可用于将char转换为应从string.ascii_letters
string.ascii_letters
我们添加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']
除去括号将列表理解变成一个生成器,它应具有更高的性能。然后,您可以使用if x in string.ascii_letters else x
来运行此字符串,就好像它是python代码一样
>>> ''.join(n[string.ascii_letters.index(x)] if x in string.ascii_letters else x for x in pattern)
'3-413289830'
您仅应使用eval,因为您可以信任所给出的输入,因为它可以执行任意代码
可以使用正则表达式split和zip_longest使其变得小而干净,如下所示>
eval
您想