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

时间:2020-07-17 08:41:35

标签: python python-3.x string refactoring

工作是解压缩字符串。 例如:

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)

我认为这是一个非常简单的问题,但是我的代码似乎笨拙,还有其他方法可以做到吗?。

5 个答案:

答案 0 :(得分:2)

import re

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

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

>>> 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

答案 1 :(得分:2)

另一种方式,new_path + new_path

zip

答案 2 :(得分:1)

您可以将列表理解用于一种解决方案:

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

输出:

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

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

答案 3 :(得分:1)

您可以使用正则表达式(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来获取该值,因为尝试直接相乘会失败(不能将字符串逐字符串相乘)。

答案 4 :(得分:0)

使用string逐对zip进行迭代,以获取char c和int n作为单独的元素,然后为{{ 1}}次

c