所以我对Python很新,而且我很难理解为什么这段代码不会编译。关键是逐行遍历文件,找出最高和最低int之间的差异,并对所有行的差异求和。在我看来,int铸造引起了一个问题;没有它Python似乎接受每个列表的第一个索引是一个字符串,但如果我尝试将该字符串转换为int,那么该索引显然不存在。
sum_count = 0
with open('C:\\...\\input_day_two.txt') as file:
for line in file:
line_list = line.split()
list_copy = line_list.copy()
line_count = len(list_copy)
smallest = int(list_copy[0])
largest = int(list_copy[0])
for index in range (line_count):
if int(list_copy[index]) < smallest:
smallest = int(list_copy[index])
if int(list_copy[index]) > largest:
largest = int(list_copy[index])
difference = largest - smallest
sum_count += difference
print(sum_count)
我最初认为尝试访问for循环之外的列表索引可能存在问题,但Python将识别并打印出循环外的列表的每个索引。我不得不想象这个错误与int解析有关,但我不明白为什么。
编辑:这是被抛出的错误
Traceback (most recent call last):
File "C:/.../adventcode_daytwo.py", line 7, in <module>
smallest = int(list_copy[0])
IndexError: list index out of range
答案 0 :(得分:0)
由于我无法完全确定您的尝试究竟是什么,请允许我指出一些已经可见的假设/增强功能:
sum_count = 0
with open('C:\\...\\input_day_two.txt', 'r') as f:
for line in f:
line_list = list(map(int, line.split()))
smallest = min(line_list)
largest = max(line_list)
sum_count += (largest - smallest) # you could just do max() - min() here instead
#sum_count += (max(line_list) - min(line_list))
print(sum_count)
走过它:
line_list = list(map(int, line.split()))
:我们通过调用文件中的行list
来创建split()
对象(因为所有行都是str
类型)然后我们{{ 1}} map()
调用返回的每个元素的int()
函数。请记住,当您致电split()
时,会返回split()
个对象(即可迭代的)。所以这为我们带来的是list
类list
的{{1}}元素。
int
:使用内置的smallest = min(line_list)
函数获取最小的整数。
min()
:使用内置的largest = max(line_list)
函数获取最大的整数。
正如我在评论中提到的,你可以通过在求和行中执行函数调用来减少行数和局部变量,但这取决于你。
如果我正在实现一些找到文件中每行的最大值和最小值之间的总和差异(假设用空格分隔),我会执行以下操作:
max()
您可以使用sums = 0
with open('/path/to/file', 'r') as f:
for line in f:
nums = list(map(int, line.split()))
sums += max(nums) - min(nums)
print(sums)
跳过nums
行到某种生成器或列表理解(有人纠正我或请发布单行)但我想不出一个这样做的方法。
答案 1 :(得分:0)
错误在于文件格式;不知何故,在文本文件中的每个有效行之后有一个额外的空行,尽管在视觉上看起来并非如此。必须有额外的新行字符或其他东西。谢谢大家。