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
答案 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']])