2016-02-09 110 views
1

IMAGIN我有三个列表,如:拆分Python列表值

l = ['2g_', '3k', '3p'] 
p = ['3f', '2y_', '4k', 'p'] 
s = ['12g', 'k_', '3p'] 

所以:

>>> ''.join(i[1]*int(i[0])+i[2:] if i[0].isdigit() else i for i in l) 
'gg_kkkppp' 
>>> ''.join(i[1]*int(i[0])+i[2:] if i[0].isdigit() else i for i in p) 
'fffyy_kkkkp' 
>>> ''.join(i[1]*int(i[0])+i[2:] if i[0].isdigit() else i for i in s) 
'2gk_ppp' 

但是在列表S: 2gk_ppp必须ggggggggggggk_ppp

+0

的问题是,你是不是取了'12',但只有它的第一位。你想达到什么目的? – Jasper

+0

我想要捕捉两位数字并打印它们的数量。例如12g必须打印g 12次...像l和p列表中的其他模式 – MLSC

+0

它不会在9以上的数字中起作用...我想将它增加到99 – MLSC

回答

4

您可以使用嵌套用正则表达式列出理解/生成器表达式。

def join(lst): 
    return ''.join((int(n or 1) * c + r 
        for (n, c, r) 
        in (re.search(r"(\d*)(\w)(.*)", x).groups() for x in lst))) 

首先,使用re.search(\d*)(\w)(.*)得到(可选的)数字,字符,和(可选),其余每串。

[re.search(r"(\d*)(\w)(.*)", x).groups() for x in lst] 

对于第二个例子,这给出[('3', 'f', ''), ('2', 'y', '_'), ('4', 'k', ''), ('', 'p', '')]。现在,在外部发生器,可以使用or来提供的情况下的"default-value"数为''(或者如果你喜欢使用三元表达式:int(n) if n else 1):

[int(n or '1') * c + r 
for (n, c, r) 
in (re.search(r"(\d*)(\w)(.*)", x).groups() for x in lst)] 

这给出['fff', 'yy_', 'kkkk', 'p']。最后,加入即可得到fffyy_kkkkp

+0

这是最可靠的答案这个线程...谢谢 – MLSC

0

这种变体是多一点点的祈使句和简单的遵循:

import re as regex 

def process_template(template): 
    result = regex.match('(\d*)(.)(.*)', template) 
    if (result.group(1)): 
     return int(result.group(1)) * result.group(2) + result.group(3) 
    else: 
     return result.group(2) + result.group(3) 

''.join([process_template(template) for template in ['3f', '2y_', '4k', 'p']])