连接字符串的每两个字符

时间:2014-09-13 15:12:43

标签: python string slice

我是Python的新手。我有一个字符串:

food = "popcorns"
beverage = "water"

如何创建一个连接每两个字符并跳过第三个字符的新字符串?像这样:

PO-CO-NS和 WA-ER

以便新字符串变为

new_food = pocons
new_beverage = waer

我正在尝试使用这种连接从无限字符串构建一个新的100个字符串。这是我到目前为止所做的:

infinite_string
for i in range(0, 32):
    new_string += infinite_string[i: i + 1: 3]

我知道这不对。任何帮助表示赞赏

5 个答案:

答案 0 :(得分:5)

您可以使用:

''.join([c for i, c in enumerate(inputstring, 1) if i % 3])

演示:

>>> food = "popcorns"
>>> beverage = "water"
>>> ''.join([c for i, c in enumerate(food, 1) if i % 3])
'pocons'
>>> ''.join([c for i, c in enumerate(beverage, 1) if i % 3])
'waer'

另一种方法是在首次创建列表后删除每隔三个字符:

characters = list(inputstring)
del characters[2::3]
result = ''.join(characters)

演示:

>>> characters = list(food)
>>> del characters[2::3]
>>> ''.join(characters)
'pocons'

答案 1 :(得分:5)

使用正则表达式:

>>> import re
>>> re.sub('(..).', r'\1', "popcorns")
'pocons'
>>> re.sub('(..).', r'\1', "water")
'waer'

答案 2 :(得分:3)

>>> food = "popcorns"
>>> ''.join(''.join(i) for i in zip(food[0::3], food[1::3]))
'pocons'

答案 3 :(得分:1)

可读且高效的版本:

''.join([input_str[i] for i in xrange(input_len) if i % 3 != 2])

我测试了ipython中四个答案的表现,结果如下:

import re
input_str = 'popcons'
input_len = len(input_str)

%timeit -n 10000 ''.join([input_str[i] for i in xrange(input_len) if i % 3 != 2])
10000 loops, best of 3: 1.07 µs per loop

%timeit -n 10000 ''.join([c for i, c in enumerate(input_str, 1) if i % 3])
10000 loops, best of 3: 1.31 µs per loop

%timeit -n 10000 re.sub('(..).', r'\1', input_str)
10000 loops, best of 3: 8.29 µs per loop

%timeit -n 10000 ''.join(''.join(i) for i in zip(input_str[0::3], input_str[1::3]))
10000 loops, best of 3: 2.06 µs per loop

答案 4 :(得分:0)

如果要生成包含x个字符的新字符串,可以尝试使用range,但是需要将字符串索引乘以每个步骤中检索到的字符数+跳过:

s = infinite_string
characters_total = 100
include_characters = 2
skip_characters = 1
step = include_characters + skip_characters
new_s  = ''.join(
    s[i * step : i * step + include_characters]
    for i in range(characters_total / include_characters))