编织N个可相等长度的可迭代参数

时间:2018-04-06 02:18:36

标签: python string list-comprehension

在下面的代码段中,我有一段代码,目前正按照我的意愿行事:

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中的答案很满意

3 个答案:

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