20

假设我有这个列表:

lis = ['a','b','c','d']

如果我这样做'x'.join(lis),结果是:

'axbxcxd'

什么是获得此输出的干净、简单的方法?

'xaxbxcxdx'

我可以写一个辅助函数:

def joiner(s, it):
    return s+s.join(it)+s

并称它为joiner('x',lis)which returns xaxbxcxdx,但它看起来并不像它应该的那样干净。有没有更好的方法来获得这个结果?

4

6 回答 6

33
>>> '{1}{0}{1}'.format(s.join(lis), s)
'xaxbxcxdx'
于 2013-07-16T17:27:08.270 回答
9

您可以加入一个以空字符串开头和结尾的列表:

>>> 'x'.join(['', *lis, ''])
'xaxbxcxdx'
于 2021-01-19T18:24:35.090 回答
3

您可以使用 f 字符串:

s = 'x'
f'{s}{s.join(lis)}{s}'

在 Python 3.8 中,您还可以使用海象运算符:

f"{(s:='x')}{s.join(lis)}{s}"

或者

(s:='x') + s.join(lis) + s
于 2021-01-16T14:38:50.750 回答
3

您可以使用str.replace()交错字符:

>>> lis = ['a','b','c','d']
>>> ''.join(lis).replace('', 'x')
'xaxbxcxdx'

另一方面,您的原始解决方案(或对字符串格式的简单修改)实际上是 IMO 非常干净和可读。

于 2021-01-16T18:33:39.230 回答
1

你也可以这样做

'x'.join([''] + lis + [''])

但我不确定它是否更清洁。

它只会在空列表中产生 1 个分隔符,而不是在问题中产生 2 个分隔符。

于 2013-07-16T17:24:19.430 回答
1

生成器可以交错字符,并且可以join编辑结果而无需创建中间字符串。

L = list('abcd')

def mixer(chars, insert):
    yield insert
    for char in chars:
        yield char
        yield insert

result = ''.join(mixer(L, 'x'))  # -> 'xaxbxcxdx'

虽然它不是单行的,但我认为它干净简单,与itertools我最初提出的这些创作不同:

from itertools import repeat, starmap, zip_longest
from operator import add

# L must have a len, so doesn't work with generators
''.join(a for b in itertools.zip_longest(repeat('x', len(L) + 1),
                                             L, fillvalue='')
            for a in b)

# As above, and worse still creates lots of intermediate strings
''.join(starmap(add, zip_longest(repeat('x', len(L) + 1), L, fillvalue='')))
于 2021-01-18T15:40:05.787 回答