2016-02-09 106 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']])