Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/346.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_String - Fatal编程技术网

Python 另一种方法是将字符串解的每个奇数字符大写

Python 另一种方法是将字符串解的每个奇数字符大写,python,string,Python,String,我刚开始学习Python,并为自己创建了一些我正在努力解决的任务 所以,我在关于使用字符串(通过索引访问字符串、更改字符串等)的章节中 我的任务是-将字符串的每个奇数字符大写。我在这里看到了解决方案: 但是我不喜欢它。。。想通过切片来解决这个问题。所以我产生了以下代码: T = 'somesampletexthere' R="" for i in range(0, len(T[1::2])): R+=T[::2][i].upper()+T[1::2][i].lower()

我刚开始学习Python,并为自己创建了一些我正在努力解决的任务

所以,我在关于使用字符串(通过索引访问字符串、更改字符串等)的章节中

我的任务是-将字符串的每个奇数字符大写。我在这里看到了解决方案:

但是我不喜欢它。。。想通过切片来解决这个问题。所以我产生了以下代码:

T = 'somesampletexthere'  
R=""

for i in range(0, len(T[1::2])):
        R+=T[::2][i].upper()+T[1::2][i].lower()

print R
当字符数为偶数时,此代码非常有效,例如TESTTEXT,但当字符数为奇数时(如示例中所示),它将跳过最后一个字符(在本例中为E)

这是因为范围是直到
len(T[1::2])
(偶数字符的长度),但如果我尝试奇数字符的长度
len(T[::2])
,我将得到错误:

IndexError: string index out of range
逻辑上,因为奇数字符的数量总是大于1(对于奇数字符的文本)

所以,我的问题是——我怎样才能消除错误?如果索引超出给定字符串的范围,Python只返回null或其他值

或者使用切片的任务的任何其他解决方案?

您可以使用三元运算符来使用和测试奇偶指数。然后使用
join
连接字符串:

>>> T = 'somesampletexthere'
>>> ''.join(x.upper() if i%2 else x.lower() for i, x in enumerate(T))
'sOmEsAmPlEtExThErE'
您可以使用以下提供的外部计数器对象来处理空白:


您选择切片解决方案而不是链接问题中的解决方案是正确的。(OTOH,这是一个稍微不同的问题,因为它跳过了空格)。但是,您当前的代码效率相当低,因为它会在
for
循环的每次迭代中重新创建
T[::2]
T[1::2]
切片。此外,对单个字符调用
.upper
.lower
的效率低于对较大字符串的调用

这里有一种使用切片的有效方法

T = 'somesampletexthere'
R = [''] * len(T)
R[::2], R[1::2] = T[::2].upper(), T[1::2].lower()
R = ''.join(R)
print(R)
输出

SoMeSaMpLeTeXtHeRe
['S', '', 'M', '', 'S', '', 'M', '', 'L', '', 'T', '', 'X', '', 'H', '', 'R', '']
['S', 'o', 'M', 'e', 'S', 'a', 'M', 'p', 'L', 'e', 'T', 'e', 'X', 't', 'H', 'e', 'R', 'e']
SoMeSaMpLeTeXtHeRe
['', 'o', '', 'e', '', 'a', '', 'p', '', 'e', '', 'e', '', 't', '', 'e', '', 'e']
['S', 'o', 'M', 'e', 'S', 'a', 'M', 'p', 'L', 'e', 'T', 'e', 'X', 't', 'H', 'e', 'R', 'e']
SoMeSaMpLeTeXtHeRe
如果我们将这些作业拆分为
R
,它可能会帮助您了解发生了什么

T = 'somesampletexthere'
R = [''] * len(T)
R[::2] = T[::2].upper()
print(R)
R[1::2] = T[1::2].lower()
print(R)
R = ''.join(R)
print(R)
输出

SoMeSaMpLeTeXtHeRe
['S', '', 'M', '', 'S', '', 'M', '', 'L', '', 'T', '', 'X', '', 'H', '', 'R', '']
['S', 'o', 'M', 'e', 'S', 'a', 'M', 'p', 'L', 'e', 'T', 'e', 'X', 't', 'H', 'e', 'R', 'e']
SoMeSaMpLeTeXtHeRe
['', 'o', '', 'e', '', 'a', '', 'p', '', 'e', '', 'e', '', 't', '', 'e', '', 'e']
['S', 'o', 'M', 'e', 'S', 'a', 'M', 'p', 'L', 'e', 'T', 'e', 'X', 't', 'H', 'e', 'R', 'e']
SoMeSaMpLeTeXtHeRe
我们可以按以下任一顺序进行切片分配:

T = 'somesampletexthere'
R = [''] * len(T)
R[1::2] = T[1::2].lower()
print(R)
R[::2] = T[::2].upper()
print(R)
R = ''.join(R)
print(R)
输出

SoMeSaMpLeTeXtHeRe
['S', '', 'M', '', 'S', '', 'M', '', 'L', '', 'T', '', 'X', '', 'H', '', 'R', '']
['S', 'o', 'M', 'e', 'S', 'a', 'M', 'p', 'L', 'e', 'T', 'e', 'X', 't', 'H', 'e', 'R', 'e']
SoMeSaMpLeTeXtHeRe
['', 'o', '', 'e', '', 'a', '', 'p', '', 'e', '', 'e', '', 't', '', 'e', '', 'e']
['S', 'o', 'M', 'e', 'S', 'a', 'M', 'p', 'L', 'e', 'T', 'e', 'X', 't', 'H', 'e', 'R', 'e']
SoMeSaMpLeTeXtHeRe

为了好玩,这里有一个替代策略,可以将大小写字符串拉到一起。在Python 3中,我们使用
izip_longest
(或
zip_longest
),因此我们可以处理奇数长度的字符串

from itertools import izip_longest

T = 'somesampletexthere'
R = ''.join([c for t in izip_longest(T[::2].upper(), T[1::2].lower(), fillvalue='') for c in t])
print(R)

虽然这个版本只在一行中完成,但我更喜欢我的第一个版本:我发现它更可读,而且可能更快一些。

如果字符串中有空格怎么办?@Andy空格保持原样
upper
lower
不会修改它们。是的,我知道,但他提供的链接表明他想将字符串中的每一个字母大写。所以你必须忽略空格。谢谢!这不是我被调查的方向,但它看起来比单独线程中提供的解决方案要好得多,非常感谢
x.isspace()
可能比
而不是x.strip()
更有效,因为它只需返回布尔值,而不必构造剥离字符串。如果你只是开始Python,你应该认真考虑学习Python 3。Python 2在2020年后将不再受支持。@PM 2Ring只是想从2开始,以便了解更多的Python 3学习书籍:)哇,谢谢!这正是我想要的,也是我试图调查的方向。这里有一个问题,我就是不明白其中的魔力。。。因此T[::2]。upper()和T[1::2]。lower()是字符串,而运行“join”时的R是按正确顺序排列的字符串列表。。。这是怎么发生的?:)@阿基里斯:魔法!:)当您从字符串中对列表执行切片赋值时,Python会将字符串解压到列表元素中。这与执行
a,b,c='abc'
时发生的情况类似-字符串被解压到
(a,b,c)
元组中。我的意思是我得到了将字符串分配到列表中的时刻(就像将char添加到float中-正如我所理解的,您将得到float)。所以R[::2],R[1::2]已经是字符列表了,我不明白为什么join()以正确的顺序加入它们。。。我想我会去看看这个函数:)无论如何,谢谢你!你太棒了@Akhiles Python是强类型的,它不允许向浮点添加字符。字符的顺序是正确的,因为我们执行切片分配的方式:转换后的偶数字符被分配给
R[::2]
,而转换后的奇数字符被分配给
R[1::2]
。join
不会以任何方式影响顺序,它只是从传递给它的列表中的字符串构建一个字符串。