繁体   English   中英

Python 3.x:转换字符串

[英]Python 3.x: Transform string

我需要将源字符串转换为扩展字符串,例如:A1f4h3L2 => AffffhhhLL

我的代码:

source = []
answer = ''
s1 = 'S15Y16r13g11b8X8J15Q9V2i18p5e10'
source += s1
i = 0
while i <= (len(source)-1):
    if source[i].isalpha:
        if source[i+1].isdigit:
            if source[i+2].isdigit:
                answer += (str(source[i]) * int(source[i+1] + source[i+2]))
                i += 2
            else:
                answer += (str(source[i]) * int(source[i+1]))
                i += 1
            i+=1

它可以工作到“ 8X”。 异常与: ValueError:以10为基数的int()的无效文字:'8X'

链接到pytontutor.com可视化

我不明白为什么代码在i == 12之前有效

您可以用pythonic方式做到这一点:

>>> a="A1f4h3L2"
>>> "".join(map(lambda x,y:x*int(y),a[::2],a[1::2]))
'AffffhhhLL'

这个怎么运作:

>>> a[::2]            # give me all alpahbhet
'AfhL'   
>>> a[1::2]           # gives me all integer
'1432'

您还可以使用zip:

>>> "".join(x*int(y) for x,y in zip(a[::2],a[1::2]))
'AffffhhhLL'

上面的数字少于10

如果数字大于10:

>>> import re
>>> s1 = 'S15Y16r13g11b8X8J15Q9V2i18p5e10'
>>> "".join(x*int(y) for x,y in zip(re.findall('[a-zA-Z]',s1),re.findall('\d+',s1)))      
'SSSSSSSSSSSSSSSYYYYYYYYYYYYYYYYrrrrrrrrrrrrrgggggggggggbbbbbbbbXXXXXXXXJJJJJJJJJJJJJJJQQQQQQQQQVViiiiiiiiiiiiiiiiiipppppeeeeeeeeee'

使用lambda和地图:

>>> "".join(map(lambda x,y:x*int(y),re.findall('[a-zA-Z]',s1),re.findall('\d+',s1)))     
'SSSSSSSSSSSSSSSYYYYYYYYYYYYYYYYrrrrrrrrrrrrrgggggggggggbbbbbbbbXXXXXXXXJJJJJJJJJJJJJJJQQQQQQQQQVViiiiiiiiiiiiiiiiiipppppeeeeeeeeee'

如果您不想使用re,请检查以下内容:

>>> s1 = 'S15Y16r13g11b8X8J15Q9V2i18p5e10'
>>> my_list =[]
>>> my_digit =''
>>> for x in s1:
...     if x.isalpha():
...         if my_digit != '':
...             my_list.append(my_digit)
...             my_digit=''
...         my_list.append(x)
...     else:
...         my_digit += x
... 
>>> my_list
['S', '15', 'Y', '16', 'r', '13', 'g', '11', 'b', '8', 'X', '8', 'J', '15', 'Q', '9', 'V', '2', 'i', '18', 'p', '5', 'e']

现在您可以像上面这样应用任何方法:

>>> "".join(x*int(y) for x,y in zip(my_list[::2],my_list[1::2]))

我首先要转换此字符串:

A = 'S15Y16r13g11b8X8J15Q9V2i18p5e10'

到此列表:

B = ['S', '15', 'Y', '16', 'r', '13', 'g', '11', 'b', '8', 'X', '8', 'J', '15', 'Q', '9', 'V', '2', 'i', '18', 'p', '5', 'e', '10']

从A到B的转换可以通过将字符串切成段来完成:

A = 'S15Y16r13g11b8X8J15Q9V2i18p5e10'
B = []
start = 0
while start < len(A):
  i = start
  while A[i].isalpha():
    i = i + 1
  k = i
  while k < len(A) and A[k].isdigit():
    k = k + 1
  B.append(A[start:i])
  B.append(A[i:k])
  start = k

现在可以更轻松地产生所需的字符串:

>>> ''.join([(B[i] * int(B[i+1])) for i in range(0, len(B), 2)])
'SSSSSSSSSSSSSSSYYYYYYYYYYYYYYYYrrrrrrrrrrrrrgggggggggggbbbbbbbbXXXXXXXXJJJJJJJJJJJJJJJQQQQQQQQQVViiiiiiiiiiiiiiiiiipppppeeeeeeeeee'

您的规范没有太详细,但是您可以轻松更改正则表达式以符合您的确切要求

>>> def expand(s):
...     from re import findall
...     return "".join([c*int(n) for c, n in zip( findall(r'[A-Za-z]+',s),
...                                               findall(r'[0-9]+',   s))])
...
>>> print(expand(('S15Y16r13g11b8X8J15Q9V2i18p5e10'))
SSSSSSSSSSSSSSSYYYYYYYYYYYYYYYYrrrrrrrrrrrrrgggggggggggbbbbbbbbXXXXXXXXJJJJJJJJJJJJJJJQQQQQQQQQVViiiiiiiiiiiiiiiiiipppppeeeeeeeeee
>>> 

re

def expand(s):

    non_d = [] ; d = [] ; current_digit = ""
    for c in s:
        if c.isdigit(): current_digit = current_digit+c
        else:
            non_d.append(c)
            if current_digit: d.append(current_digit)
            current_digit = ""
    d.append(current_digit)
    return("".join(c*int(n) for c,n in zip(non_d, d)))

s = 'S15Y16r13g11b8X8J15Q9V2i18p5e10'
print expand(s)

输出量

SSSSSSSSSSSSSSSYYYYYYYYYYYYYYYYrrrrrrrrrrrrrgggggggggggbbbbbbbbXXXXXXXXJJJJJJJJJJJJJJJQQQQQQQQQVViiiiiiiiiiiiiiiiiipppppeeeeeeeeee

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM