在之前,之间和之后加入字符串

时间:2013-07-16 17:19:41

标签: python string

假设我有这个清单:

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

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

'axbxcxd'

获得此输出的简洁方法是什么?

'xaxbxcxdx'

我可以写一个辅助函数:

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

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

7 个答案:

答案 0 :(得分:22)

>>> '{1}{0}{1}'.format(s.join(lis), s)
'xaxbxcxdx'

答案 1 :(得分:7)

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

>>> 'x'.join(['', *lis, ''])
'xaxbxcxdx'

答案 2 :(得分:4)

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

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

另一方面,您的原始解决方案(或带有字符串格式的微不足道的修改)实际上是 IMO 非常干净和可读的。

答案 3 :(得分:3)

您可以使用 f 字符串:

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

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

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

(s:='x') + s.join(lis) + s

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

答案 5 :(得分:0)

你也可以这样做

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

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

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

答案 6 :(得分:-1)

我认为你可以在 python 中使用 for 循环

var mapObject = {"one": 1, "two": 2, "three": 3, "four": 4};
var n = 2;
var result = Object.values(mapObject)[n];
console.log(result); // Should print 3. Remember arrays are 0-indexed.```

这段代码如何: for 循环将工作并打印第一个值,即 a,然后将 x 添加到它,同样的事情会发生在 b、c 和 d