如果抛出错误,则在内部交换变量位置
Posted
技术标签:
【中文标题】如果抛出错误,则在内部交换变量位置【英文标题】:Swapping variable places inside if throws an error 【发布时间】:2017-06-30 19:08:43 【问题描述】:for i in range(len(data_list) - 1):
if(data_list[i] == 0):
continue;
timeline[int(int(data_list[i][1:]) / FIFTEEN_MINUTE_MS)] += 1;
k = i + 1;
while k < len(data_list) - 1:
if data_list[i][0] == data_list[k][0]:
print(data_list[i]);
print(data_list[k]);
tyre1 = int(data_list[i][1:]);
tyre2 = int(data_list[k][1:]);
#Error here
if((tyre2 - tyre1) < TWENTY_MPH and (tyre2 - tyre1) > SIXTY_MPH):
print(data_list);
if data_list[i][:1] == 'A':
if data_list[i + 1][:1] == 'A':
north += 1;
else:
south += 1;
data_list[i] = 0;
data_list[k] = 0;
break;
else:
k += 1;
else:
k += 1;
这段代码运行良好,我得到了输出。但是当我像这样在 if 语句中交换 tyre1 和 tyre2 时
if(tyre2 - tyre1 < TWENTY_MPH and tyre2 - tyre1 > SIXTY_MPH):
我收到此错误。
Traceback (most recent call last):
File "<pyshell#20>", line 1, in <module>
data_analyse(data_list)
File "C:\Users\xxx\Desktop\data.py", line 19, in data_analyse
if data_list[i][:1] == data_list[k][:1]:
TypeError: 'int' object is not subscriptable
我没看到什么?
编辑:
关于 data_list 的信息
data_list = ['A268981', 'A269123', 'A604957', 'B604960', 'A605128', 'B605132', 'A1089807', 'B1089810', 'A1089948', 'B1089951']
为什么我在没有人说出原因的情况下被否决了?初学者在这里提问并不容易。
编辑 2:添加打印语句来检查整数
i: 0
k: 1
A268981
A269123
['A268981', 'A269123', 'A604957', 'B604960', 'A605128', 'B605132', 'A1089807', 'B1089810', 'A1089948', 'B1089951']
i: 2
k: 4
A604957
A605128
[0, 0, 'A604957', 'B604960', 'A605128', 'B605132', 'A1089807', 'B1089810', 'A1089948', 'B1089951']
常量的值
TWENTY_MPH = 280
SIXTY_MPH = 100
【问题讨论】:
嗯,错误很明显data_list[i]
已经是一个整数,所以你不能在上面加上[:1]
。
@WillemVanOnsem data_list = ['A268981', 'A269123', 'A604957', 'B604960', 'A605128', 'B605132', 'A1089807', 'B1089810', 'A108994' B1089951'];
在旁注中,这种比较是相当模棱两可的。不确定它的作用是不是你想要的
@MosesKoledoye 似乎在切换变量的情况下按预期工作。我正在尝试检查两个字符串是否都以'A'开头
是的,我想你很好,-
操作首先被评估
【参考方案1】:
我认为你的算法应该重新考虑。
基本上你正在做的是
for i in [0..N]:
for k in [i..N]:
my_string_1 = data[i][0]
my_string_2 = data[k][0]
if my_string_1 == my_string_2:
data[i] = 0
data[k] = 0
这里的问题是,在某些时候,条件得到验证,您将 0
分配给 data[k]
,但随后在另一个 i 循环迭代中,对于相同的 k
值,您读回该值并处理就好像它是那些 'A268981'
字符串中的一些,它失败了。
例子:
i = 3
k = 7
data[k] = 0
后来
i = 5
k = 7
data[k][0] <-- error
我没有运行您的代码,但我想这可能会或可能不会发生,具体取决于 if(tyre1 - tyre2 < TWENTY_MPH and tyre1 - tyre2 > SIXTY_MPH):
的其他条件,这就是您看到或不看到它的原因,具体取决于该条件。
另外,我不知道这些常量是什么,但我看不出同一个值怎么可能是 60。你也应该发布这些值。
注意:在处理字符串时,data_list[i][0]
在我看来等同于data_list[i][:1]
,并且比data_list[i][:1]
更具可读性。
【讨论】:
我也是这么想的。所以我在条件之前添加了一个打印语句。将其添加到原始问题中。 您没有编辑代码以显示那些print
语句的位置,但看起来就像我说的那样,不是吗?
我添加了照片。不,他们在分配期间不是整数。
当您使用它时,您不妨在崩溃的行之前打印 i 和 k、data_list[i] 和 data_list[k]。
我刚刚添加了那个伙伴以上是关于如果抛出错误,则在内部交换变量位置的主要内容,如果未能解决你的问题,请参考以下文章