有没有比这种方法更有效的方法?

is there a more efficient way than this method?

任务是解压一个字符串。 例如:

if a string is 'a3b4c2' then decompress it as 'aaabbbbcc'.

我之前试过的代码是

list1 = [i for i in a]
listNum = list(map(int,list(filter(lambda x:x.isdigit(),list1))))
listChar = list(filter(lambda x: not x.isdigit(),list1))
b = ''
for i in range(len(listNum)):
    b += listChar[i]*listNum[i]
print(b)

我认为这是一个很简单的问题,但我的代码似乎很笨拙,还有其他方法吗?

import re

b = ''.join(c * int(n) for c, n in re.findall(r'(\w)(\d+)', a))

正则表达式将每个字母与以下数字(容纳多位数字)匹配,并且 return 它们成组:

>>> re.findall(r'(\w)(\d+)', a)
[('a', '3'), ('b', '4'), ('c', '2')]

然后你只需要遍历它们…

for c, n in ...
# c = 'a'
# n = '3'
# ...

...并将它们相乘...

c * int(n)

...并在生成器表达式中简单地执行此操作...

c * int(n) for c, n in re.findall(r'(\w)(\d+)', a)

…和''.join所有生成的小字符串在一起。

为了好玩,这里有一个版本甚至允许没有数字的独立字母:

a = 'a3bc4d2e'
b = ''.join(c * int(n or 1) for c, n in re.findall(r'(\w)(\d+)?', a))
# aaabccccdde

您可以使用列表推导式作为单行解决方案:

input='a3b4c2'
result=''.join(input[i] * int(input[i+1]) for i in range(0,len(input),2))

输出:

>>> result
aaabbbbcc
  • * 运算符可用于将整数与字符相乘。

  • join 方法被调用以将子字符串列表连接到完整字符串。

换个方式,zip + splicing,

>>> value = 'a3b4c2'
>>> 
>>> "".join(x*int(y) for x, y in zip(value[0::2], value[1::2]))
'aaabbbbcc'
>>> 

您可以使用正则表达式(re 模块),使用分组和函数作为第二个 re.sub 参数,遵循方式

import re
a = 'a3b4c2'
def decompress(x):
    return x.group(1)*int(x.group(2))
output = re.sub(r'(\D)(\d+)', decompress, a)
print(output)  # aaabbbbcc

说明我在字符串中查找单个非数字 (\D) 后跟一位或多位数字 (\d+)。对于每场比赛,首先进入第一组,然后进入第二组,因此在模式中有括号。然后每个匹配项都替换为第一组内容(字符串)乘以第二组内容的 value。请注意,我使用 int 来获取该值,因为尝试直接乘法会失败(您不能将字符串乘以字符串)。

使用 zip 成对迭代 string,将 char c 和 int n 作为单独的元素,然后复制 char c n

>>> str = 'a3b4c2'
>>> s = iter(str)
>>> ''.join(c*int(n) for c,n in zip(s, s))
'aaabbbbcc'