拆分python列表值

时间:2016-02-09 09:42:24

标签: python list split

Imagin我有三个列表:

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'

但是列表中的内容: 2gk_ppp必须为ggggggggggggk_ppp

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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']])