Python 串接字符串的每两个字符

Python 串接字符串的每两个字符,python,string,slice,Python,String,Slice,我是Python新手。我有一个字符串: food = "popcorns" beverage = "water" 如何创建一个新字符串,将每两个字符连接起来并跳过第三个字符?像这样: PO-CO-NS和 瓦尔 这样新字符串就变成 new_food = pocons new_beverage = waer 我正在尝试使用这种连接从无限字符串构建一个新的100个字符的字符串。以下是我目前掌握的情况: infinite_string for i in range(0, 32): new_s

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

food = "popcorns"
beverage = "water"
如何创建一个新字符串,将每两个字符连接起来并跳过第三个字符?像这样:

PO-CO-NS和 瓦尔

这样新字符串就变成

new_food = pocons
new_beverage = waer
我正在尝试使用这种连接从无限字符串构建一个新的100个字符的字符串。以下是我目前掌握的情况:

infinite_string
for i in range(0, 32):
    new_string += infinite_string[i: i + 1: 3]
我知道这不对。非常感谢您提供的任何帮助

您可以使用:

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

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

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

您可以使用:

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

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

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


使用正则表达式:

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

使用正则表达式:

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

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

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))

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

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))

可读且高效的版本:

''.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

可读且高效的版本:

''.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

缺少限制为100个字符的指令,如果输入是无限字符串…要将结果字符串的长度限制为100个字符,re.sub'…',r'\1',big_string[:150]就足够了。150来自100*3/2的missing指令,将其限制为100个字符,如果输入是无限字符串…要将结果字符串的长度限制为100个字符,re.sub'…',r'\1',big_string[:150]就足够了。150来自100*3/2@Aprillion当前位置字符串不可能是无限的。我相信人们可以想出一个类似字符串的对象,它是无限的,无限的字符串不一定是内置的。当我说无限字符串时,我不是指无限字符串。我的意思是像一个1000个字符的字符串。我需要一个足够结实的东西来处理一个大的字符串。@cooldood3490:1000不是大的。这将处理你的字符串。@Aprillion:strings不能是无限的。我确信你可以想出一个类似字符串的对象,它是无限的,无限的字符串不一定是内置的。当我说无限字符串时,我不是指无限的字符串。我的意思是像一个1000个字符的字符串。我需要一个足够结实的东西来处理一个大的字符串。@cooldood3490:1000不是大的。这将处理您的字符串。没有无限字符串。没有无限字符串。