我得到一个TypeError,我不明白为什么。错误发生在c = t[i][0]
(根据调试器)。我有3个字符组(列表):g1
,g2
和g3
我试图通过减去键k1
,{{1}来更改字符串索引来自索引的{或k2
。我现在用于测试的内容:
k3
这是代码:
text = 'abcd'
l_text = [('a', 0), ('b', 1), ('c', 2), ('d', 3)]
k1, k2, k3 = 2, 3, 1
有人可以解释我为什么会收到此错误,我该如何解决?这不像我在那里使用def rotate_left(text, l_text, k1, k2, k3):
i = 0
newstr = [None]*len(text)
for t in l_text: # t = tuple
c = t[i][0]
if c in g1: # c = char
l = int(l_text[i][1]) # l = index of the char in the list
if l - k1 < 0:
newstr[l%len(text)-k1] = l_text[i][0]
else:
newstr[l-k1] = l_text[i][0]
elif c in g2:
l = l_text[i][1] # l = index of the char in the list
if l - k1 < 0:
newstr[l%len(text)-k2] = l_text[i][0]
else:
newstr[l-k2] = l_text[i][0]
else:
l = l_text[i][1] # l = index of the char in the list
if l - k1 < 0:
newstr[l%len(text)-k3] = l_text[i][0]
else:
newstr[l-k3] = l_text[i][0]
i += 1
return newstr
类型。调试器显示它是str类型,并在第二次迭代后中断。
更新:
int
答案 0 :(得分:4)
您正在索引每个个人元组:
c = t[i][0]
i
以0
开头,但是每次循环迭代都会增加它:
i += 1
for
循环将t
绑定到来自l_text
的每个元组,因此首先t
绑定到('a', 0)
,然后绑定到('b', 1)
等等。
首先,您要查看的('a', 0)[0][0]
'a'[0]
是'a'
。您查看('b', 1)[1][0]
的下一次迭代1[0]
会引发您的异常,因为整数不是序列。
您需要删除i
;你 需要在这里保留一个正在运行的索引,因为for t in l_text:
已经为你提供每个单独的元组。
答案 1 :(得分:3)
错误在于:
l_text = [('a', 0), ('b', 1), ('c', 2), ('d', 3)]
...
for t in l_text: # t = tuple
# t is a tuple of 2 items: ('a', 0)
c = t[i][0] # Breaks when i == 1
我想你想要:
c = t[0]
第一次围绕循环没有中断,因为i == 0
时,t[i]
为'a'
,然后t[i][0]
也是'a'
。
答案 2 :(得分:1)
你正在做错误的索引部分。你的元组是1维的,所以你不能使用2-D数组下标符号。 假设
t = ('a',0)
您应该使用t[0]
或t[1]
分别访问a
和0
。
希望它有所帮助.. :)
答案 3 :(得分:1)
问题是t是一个元组,你可以访问像列表一样的元组中的元素。目前,您可以访问像2D列表这样的元素,如果您的列表导致尝试索引char,则会显示这些元素。
for t in l_text: # t = tuple
c = t[i][0]
应改为
for t in l_text: # t = tuple
c = t[0]