【问题标题】:Python 3.x : I'm out of rangePython 3.x:我超出范围
【发布时间】:2022-01-03 08:38:20
【问题描述】:

我要求提供一些帮助,因为我相信我知道为什么我超出了范围,但我不知道如何解决它。谢谢你:D

#Import input.
from pathlib import Path
test = Path(r'C:\Users\Helphy\Desktop\Perso\GitHub\Advent_of_Code_2021\Day_3\Input.txt').read_text().split("\n")
#Defined some variable 
temp = []
finalnumtemp = []
finalnum = []
f_num = []
zero = 0
one = 0
for t in range(len(test)):
    for j in range(len(test)):
        temp = list(test[j])
        print(temp)
        finalnumtemp.append(temp[j])
        print(finalnumtemp)
     """for i in range(len(finalnumtemp)):
        if int(finalnumtemp[i]) == 0:
            zero += 1
        else:
            one += 1
    if zero > one:
        finalnum.append(0)
    else:
        finalnum.append(1)
    zero == 0
    one == 0
    finalnumtemp = []
print(finalnum)"""
    Input :
    00100
    11110
    10110
    10111
    10101
    01111
    00111
    11100
    10000
    11001
    00010
    01010
error: An exception has occurred: IndexError 
list index out of range
  File "C: \ Users \ Helphy \ Desktop \ Perso \ GitHub \ Advent_of_Code_2021 \ Day_3 \ Day_3.py", line 16, in <module>
    finalnumtemp.append (temp [j])

【问题讨论】:

  • 你能分享完整的回溯吗?
  • 做完就知道好不好了
  • 问自己问题test变量是什么数据类型?我在temp = list(test[j]) 中收到了什么? temp 列表的长度是多少,如果 jrange(len(test)) 中,这真的与 temp 值长度有关吗?我可以在这里做temp[j] 还是长度不同?尝试为变量使用更好的名称,这样更容易在视觉上将它们分开。
  • test 变量接收List[str] 类型,然后temp 接收list of chars 因为当您执行test[j] 时您引用str 而当您执行list(test[j]) 时您转换字符串到字符列表。您的j in range(len(test)),假设 len(test) 在您的测试文件中可以是 100 个单词。当len(temp) 是单个单词的长度时,假设5 个字符,所以temp[j] 是错误的,导致j 超过最大索引。您需要更改此行使用 t 索引:for j in range(len(test[t])):
  • 谢谢你我解决了。真的,我保证有更好的名字^^

标签: python-3.x indexoutofrangeexception


【解决方案1】:

要解决什么问题?您打算让该计划实现什么目标?

你有一个错误,因为......

  • j0变为len(test),即12
  • test[j]temp 一样只有 5 个元素。

要在temp 中的数字中进行选择,索引应该是01234(第一、第二、第三、...左)或-1-2-3-4-5(第一,第二,第三,......从右边)。

要将temp 中的第一个附加到finalnumtemp,请修复

        finalnumtemp.append(temp[j])

        finalnumtemp.append(temp[0])

【讨论】:

  • 有练习的通知:adventofcode.com/2021/day/3 我想为每个循环取第一个临时数。对不起我的英语^^'我会做一个例子00100 11110 10110 10111 10101 01111 00111 11100 10000 11001 00010 01010 我会拿第一列有1多于0所以结果是1然后我重新开始第二列比 0 多,所以我将它添加到最后一个结果中,例如:10 并再次以 10110 结束。
  • 是的,但我需要使用循环更改 temp 列,例如:``` finalnumtemp.append(temp[0]) 循环检查总和 finalnumtemp.append(temp[1])等等等等```
【解决方案2】:

也许你应该研究一下列表理解。我知道一开始这可能有点令人生畏,但在我掌握了它们之后,我个人发现它比嵌套 for 循环更有意义。您可以在一行中将零和一字符串转换为单独的整数列表:

numbers = [[int(char) for char in line] for line in test]
[[0, 0, 1, 0, 0], [1, 1, 1, 1, 0], ... , [0, 0, 0, 1, 0], [0, 1, 0, 1, 0]]

然后获取第一个数字(或任何数字):

first_num = [num[0] for num in numbers]
[0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0]

如果您愿意,甚至可以对列表执行操作:

sum_num = [sum(num) for num in numbers]
[1, 4, 3, 4, 3, 4, 3, 3, 1, 3, 1, 2]

嵌套的 for 循环会很快变得非常混乱。我知道这不是问题的实际答案,但我认为无论如何它可能会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-25
    • 1970-01-01
    • 2016-10-23
    • 2014-01-16
    • 2016-02-14
    • 1970-01-01
    相关资源
    最近更新 更多