我是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]
我知道这不对。任何帮助表示赞赏
答案 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))