还有比这种方法更有效的方法吗?

2024-09-29 19:34:02 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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)

我认为这是一个相当简单的问题,但我的代码似乎很笨拙,有没有其他方法可以做到这一点


Tags: lambda字符串代码inforstringifis
3条回答

您可以将列表理解用于单行解决方案:

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

输出:

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

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

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

另一种方式,zip+splicing

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

相关问题 更多 >

    热门问题