Python TypeError:字符串索引必须是整数..有什么问题吗

Python TypeError:字符串索引必须是整数..有什么问题吗,python,python-3.x,python-2.7,Python,Python 3.x,Python 2.7,我得到了TypeError:字符串索引必须是整数。。。我怎样才能解决这个问题? 代码是: def myfunc(x): y='' for i in x: y=y+x[i].upper() +x[i+1] i+=2 return y 您应该索引x迭代x的实际索引,而不是其值,从而执行范围(len(x))或枚举(x)。此外,您不能在for循环中修改迭代器,如果要这样做,您需要while: def myfunc(x): y=''

我得到了TypeError:字符串索引必须是整数。。。我怎样才能解决这个问题? 代码是:

def myfunc(x):
    y=''
    for i in x:
        y=y+x[i].upper() +x[i+1]
        i+=2

    return y

您应该索引
x
迭代
x
的实际索引,而不是其值,从而执行
范围(len(x))
枚举(x)
。此外,您不能在
for
循环中修改迭代器,如果要这样做,您需要
while

def myfunc(x):
    y=''
    i = 0
    while i < len(x) - 1:
        y=y+x[i].upper() +x[i+1]
        i+=2

    return y
def myfunc(x):
y=''
i=0
而i
您应该索引
x
迭代
x
的实际索引,而不是其值,从而执行
范围(len(x))
枚举(x)
。此外,您不能在
for
循环中修改迭代器,如果要这样做,您需要
while

def myfunc(x):
    y=''
    i = 0
    while i < len(x) - 1:
        y=y+x[i].upper() +x[i+1]
        i+=2

    return y
def myfunc(x):
y=''
i=0
而i
当你说:
对于x中的i:
就像你说的“对于x字符串中的每个字母”,所以在每次迭代中,
i
将是字符串中的下一个字母。您可以使用
print i
语句创建一个简单的循环来查看行为

代码的另一个问题是
x[i+1]
语句。当for循环到达最后一次迭代时,您将尝试访问不存在的内容,并将得到一个
索引器。话虽如此,您应该像这样修改代码:

def myfunc(x):
    y = ''
    for i in range(0, len(x) - 1, 2):
        y = y + x[i].upper() + x[i + 1]
    return y
因为您希望每隔一个字符迭代一次,所以我还为
范围使用了另一组参数:
范围([start],stop[,step])

  • 开始:序列的开始编号
  • 停止:生成最多的数字,但不包括此数字
  • 步骤:序列中每个数字之间的差值

干杯

当你说:
对于x中的i:
就像你说的“对于x字符串中的每个字母”,所以在每次迭代中,
i
将是字符串中的下一个字母。您可以使用
print i
语句创建一个简单的循环来查看行为

代码的另一个问题是
x[i+1]
语句。当for循环到达最后一次迭代时,您将尝试访问不存在的内容,并将得到一个
索引器。话虽如此,您应该像这样修改代码:

def myfunc(x):
    y = ''
    for i in range(0, len(x) - 1, 2):
        y = y + x[i].upper() + x[i + 1]
    return y
因为您希望每隔一个字符迭代一次,所以我还为
范围使用了另一组参数:
范围([start],stop[,step])

  • 开始:序列的开始编号
  • 停止:生成最多的数字,但不包括此数字
  • 步骤:序列中每个数字之间的差值

干杯

尽可能避免迭代索引。您可以通过迭代
x
zipped和它自己的尾巴来实现这一点:

def myfunc(x):
    y = ''
    for x1, x2 in zip(x, x[1:]):
        y = y + x1.upper() + x2
    return y
甚至更好(更高效),您可以使用
join
从一个列表创建
y

import itertools
def myfunc(x):
    return ''.join(list(itertools.chain.from_iterable(x1.upper() + x2 for x1,x2 in zip(x, x[1:]))))

尽可能避免迭代索引。您可以通过迭代
x
zipped和它自己的尾巴来实现这一点:

def myfunc(x):
    y = ''
    for x1, x2 in zip(x, x[1:]):
        y = y + x1.upper() + x2
    return y
甚至更好(更高效),您可以使用
join
从一个列表创建
y

import itertools
def myfunc(x):
    return ''.join(list(itertools.chain.from_iterable(x1.upper() + x2 for x1,x2 in zip(x, x[1:]))))

您可以使用
枚举

代码:

输出:

AbCdEf

您可以使用
枚举

代码:

输出:

AbCdEf

你应该小心
x[i+1]
。您可能会收到
索引器
@尼克松在如何实现
循环方面展示了一种正确的方法。我怀疑这与<“nope”中i的code>:打印(i)
i+=2
没有任何影响,因为循环的下一次迭代将简单地用
x
的下一个元素覆盖
i
的值。您应该小心
x[i+1]
。您可能会收到
索引器
@尼克松在如何实现
循环方面展示了一种正确的方法。我怀疑这与<“nope”中i的code>:打印(i)
i+=2
没有任何影响,因为循环的下一次迭代将简单地用
x
的下一个元素覆盖
i
的值
i+=2
是没有意义的;你对
i
所做的任何更改都会被你正在迭代的内容中的下一个值覆盖。是的,我忘记了:)我更新了我的答案。非常感谢。很抱歉实际上,我本想在问题中添加该评论,但点击了错误的“添加评论”链接。
I+=2
毫无意义;你对
i
所做的任何更改都会被你正在迭代的内容中的下一个值覆盖。是的,我忘记了:)我更新了我的答案。非常感谢。很抱歉实际上,我是想把那个评论添加到问题中,然后点击了错误的“添加评论”链接。如果x的长度是奇数,你会在这里得到一个索引器。True@Moberg主要关注循环的逻辑,而忽略了内部代码。现在应该没事了。如果x的长度是奇数,那么你会得到一个索引器。True@Moberg主要关注循环的逻辑,而忽略了内部代码。现在应该没事了。谢谢