在下面的代码段中,我有一段代码,目前正按照我的意愿行事:
def weave_iterable(*iters):
return ''.join('{}'.format('{}'*len(chars)).format(*chars) for chars in zip(*iters))
>>> string1 = 'aeim'
>>> string2 = 'bfjn'
>>> string3 = 'cgko'
>>> string4 = 'dhlp'
>>> string5 = '----'
>>> iterable_args = (string1, string2, string3, string4, string5)
>>> weave_iterable(*iterable_args)
'abcd-efgh-ijkl-mnop-'
但是,我想知道我的weave_iterable
函数是否有更高效和/或更多Pythonic格式化文本的方式?具体来说,我想知道是否有任何方法可以避免两次使用.format()
,因为传递给此函数的参数数量未知。我正在使用Python 2.7进行开发,但对Python 3.x中的答案很满意
答案 0 :(得分:4)
您可以使用zip
对可迭代的相应元素进行分组,并使用itertool.chain
来平滑生成的分组迭代。然后,您可以直接将结果传递给join
方法:
>>> from itertools import chain
>>> l = ['aeim', 'bfjn', 'cgko','dhlp','----']
>>> "".join(chain(*zip(*l)))
>>> 'abcd-efgh-ijkl-mnop-'
您的功能将变为
>>> def weave_iterable(*iters):
return "".join(chain(*zip(*iters)))
答案 1 :(得分:1)
您可以再次调用''.join()
以避免{}*len(xx)
。
return ''.join(''.join(chars) for chars in zip(*iters))
完整计划:
def weave_iterable(*iters):
return ''.join(''.join(chars) for chars in zip(*iters))
string1 = 'aeim'
string2 = 'bfjn'
string3 = 'cgko'
string4 = 'dhlp'
string5 = '----'
assert weave_iterable(string1, string2, string3, string4, string5) == 'abcd-efgh-ijkl-mnop-'
除此之外:如果您总是想要以连字符分隔的字母簇,可以使用'-'.join(...)
指定,如下所示:
def weave_iterable(*iters):
return '-'.join(''.join(chars) for chars in zip(*iters))
string1 = 'aeim'
string2 = 'bfjn'
string3 = 'cgko'
string4 = 'dhlp'
assert weave_iterable(string1, string2, string3, string4) == 'abcd-efgh-ijkl-mnop'
答案 2 :(得分:0)
您还可以使用more_itertools
第三方库定期interleave
字符串和intersperse
短划线:
import more_itertools as mit
s1 = "aeim"
s2 = "bfjn"
s3 = "cgko"
s4 = "dhlp"
"".join(mit.intersperse("-", mit.interleave(s1, s2, s3, s4), n=4)) + "-"
# 'abcd-efgh-ijkl-mnop-'