如果抛出错误,则在内部交换变量位置

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 &lt; TWENTY_MPH and tyre1 - tyre2 &gt; SIXTY_MPH): 的其他条件,这就是您看到或不看到它的原因,具体取决于该条件。

另外,我不知道这些常量是什么,但我看不出同一个值怎么可能是 60。你也应该发布这些值。

注意:在处理字符串时,data_list[i][0] 在我看来等同于data_list[i][:1],并且比data_list[i][:1] 更具可读性。

【讨论】:

我也是这么想的。所以我在条件之前添加了一个打印语句。将其添加到原始问题中。 您没有编辑代码以显示那些 print 语句的位置,但看起来就像我说的那样,不是吗? 我添加了照片。不,他们在分配期间不是整数。 当您使用它时,您不妨在崩溃的行之前打印 i 和 k、data_list[i] 和 data_list[k]。 我刚刚添加了那个伙伴

以上是关于如果抛出错误,则在内部交换变量位置的主要内容,如果未能解决你的问题,请参考以下文章

如何在内部函数中使用类变量?

如果数组索引超出范围,则尝试抛出范围错误(C++)

元组 (a,b)=(b,a) 中的成员交换如何在内部工作?

ORA-01722: 将值从内部选择查询传递到顶部选择查询时数字无效

JVM 如何在内部处理竞争条件?

在内部生成 laravel 护照令牌。 401错误未经授权