Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 我怎样才能反转切片?_Python_Slice - Fatal编程技术网

Python 我怎样才能反转切片?

Python 我怎样才能反转切片?,python,slice,Python,Slice,我现在的代码 sentence = "Sentence!" print(*sentence[::3], sep="--") 输出:S--t--c 我怎样才能反转切片,使相同的输入产生-en-en-e 我尝试过在:3中使用-3和不同的数字,但是没有任何效果使用切片无法实现您想要实现的目标,因为您想要保留的索引(1、2、4、5、7、8)不是索引 由于目标是用-符号替换每三个字符中的第一个字符,因此我能想到的最简单的解决方案是使用正则表达式: >>重新导入 >>>re.sub(“.({0,2})”,

我现在的代码

sentence = "Sentence!"
print(*sentence[::3], sep="--")
输出:
S--t--c

我怎样才能反转切片,使相同的输入产生
-en-en-e


我尝试过在
:3中使用-3和不同的数字,但是没有任何效果使用切片无法实现您想要实现的目标,因为您想要保留的索引(1、2、4、5、7、8)不是索引

由于目标是用
-
符号替换每三个字符中的第一个字符,因此我能想到的最简单的解决方案是使用正则表达式:

>>重新导入
>>>re.sub(“.({0,2})”,r“-\1”,“句子!”)
“-en-en-e!”
>>>re.sub(“.({0,2})”,r“-\1”,“你好,世界!”)
“-el-o,-wold-”

{0,2}
意味着即使最后一组没有三个字母,模式也会匹配。

使用切片无法实现您想要实现的目标,因为您想要保留的索引(1,2,4,5,7,8)不是一个索引

由于目标是用
-
符号替换每三个字符中的第一个字符,因此我能想到的最简单的解决方案是使用正则表达式:

>>重新导入
>>>re.sub(“.({0,2})”,r“-\1”,“句子!”)
“-en-en-e!”
>>>re.sub(“.({0,2})”,r“-\1”,“你好,世界!”)
“-el-o,-wold-”
{0,2}
表示即使最后一组没有三个字母,模式也会匹配。

如下:

sentence = 'Sentence!'

import re
tokens = re.findall(r'.(..)', sentence)
print('', '-'.join(tokens), sep='-')  # prints:  -en-en-e!

编辑:在评论中回答问题:

这是可行的,但我怎样才能从第三个字母开始呢

你可以试试这个:

tokens = re.findall(r'(..).?', sentence[2:])
print(*tokens, sep='-')
这将输出:
nt nc

这就是你想要的吗?

像这样:

sentence = 'Sentence!'

import re
tokens = re.findall(r'.(..)', sentence)
print('', '-'.join(tokens), sep='-')  # prints:  -en-en-e!

编辑:在评论中回答问题:

这是可行的,但我怎样才能从第三个字母开始呢

你可以试试这个:

tokens = re.findall(r'(..).?', sentence[2:])
print(*tokens, sep='-')
这将输出:
nt nc


这就是你想要的吗?

如果你想真正反转范围,那么取不在该范围内的指数:

''.join(sentence[i] if i not in range(0, len(sentence), 3) else '-'
        for i in range(len(sentence)))
输出

'-en-en-e!'

就我个人而言,我更喜欢正则表达式解决方案。

如果你想真正反转范围,那么选择不在该范围内的索引:

''.join(sentence[i] if i not in range(0, len(sentence), 3) else '-'
        for i in range(len(sentence)))
输出

'-en-en-e!'
就个人而言,我更喜欢正则表达式解决方案。

另一种尝试:

sentence = ("Sentence!")
print(''.join(ch if i % 3 else '-' for i, ch in enumerate(sentence)))
印刷品:

-en-en-e!

如果
句子class='Hello,world!'

-el-o,-wo-ld-
另一次尝试:

sentence = ("Sentence!")
print(''.join(ch if i % 3 else '-' for i, ch in enumerate(sentence)))
印刷品:

-en-en-e!

如果
句子class='Hello,world!'

-el-o,-wo-ld-

您可以使用切片分配:

def invert(string, step, sep):
    sentence = list(string)
    sentence[::step] = len(sentence[::step]) * [sep]
    return ''.join(sentence)

print(invert('Sentence!', 3, '*'))
# *en*en*e!

print(invert('Hallo World!', 4, '$'))
# $all$ Wo$ld!

您可以使用切片分配:

def invert(string, step, sep):
    sentence = list(string)
    sentence[::step] = len(sentence[::step]) * [sep]
    return ''.join(sentence)

print(invert('Sentence!', 3, '*'))
# *en*en*e!

print(invert('Hallo World!', 4, '$'))
# $all$ Wo$ld!

如果字符串的长度不是三的倍数,则这将从最后一部分删除。@kaya3:同意。但我认为,由于原始海报的代码给出了“s--t--c”的输出,这就减少了最后一部分(最后的
--
),(s)他更关心的是做
字符串[::3]
的反转,而不是保留其余部分。(如果这不是真的,那么原始海报应该能够修改代码以处理3的非倍数。)我如何让它添加3的倍数
tokens=re.findall(r.(..),(..),(..),句子)
尝试过类似的东西,但没有work@3891,我不知道你说的“让它加上3的倍数”是什么意思。您想输出一个总和吗?如果字符串的长度不是三的倍数,则最后一部分的总和将减少。@kaya3:同意。但我认为,由于原始海报的代码给出了“s--t--c”的输出,这就减少了最后一部分(最后的
--
),(s)他更关心的是做
字符串[::3]
的反转,而不是保留其余部分。(如果这不是真的,那么原始海报应该能够修改代码以处理3的非倍数。)我如何让它添加3的倍数
tokens=re.findall(r.(..),(..),(..),句子)
尝试过类似的东西,但没有work@3891,我不知道你说的“让它加上3的倍数”是什么意思。你想输出一个总和吗?我喜欢这个解决方案,因为它尽可能接近切片逻辑的直接反转,更明显的是如何调整它以反转不同的切片。谢谢。这适用于各种各样的反转操作,但结果明显是冗长的。使用
枚举
可以使它更简洁;我通常会尽量把“新技术”(超出原来的帖子)控制在最低限度。我已经有了一个条件理解和
join
。我喜欢这个解决方案,因为它尽可能接近切片逻辑的直接反转,更明显的是如何调整它以反转不同的切片。谢谢。这适用于各种各样的反转操作,但结果明显是冗长的。使用
枚举
可以使它更简洁;我通常会尽量把“新技术”(超出原来的帖子)控制在最低限度。我已经有了条件理解和加入。