工作是解压缩字符串。 例如:
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)
我认为这是一个非常简单的问题,但是我的代码似乎笨拙,还有其他方法可以做到吗?。
答案 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