3

我有一个包含数字行的文本文件。我的程序正在尝试提取代码行并将它们放入一个列表中,每个列表由构成文件中该行的数字组成,然后将所有这些列表放入一个列表中(让我们称之为三角形)Triangle[x]并有一个函数应用于它们,但是当我尝试使用它时,Python 解释器说它是一个整数类型,但是当我问它时type(Triangle[x]),它说它是一个列表。我的代码如下:

def compare(a,b):
"""Returns the larger of a and b"""
if a > b:
    return a
else:
    return b

doc = open('C:/Users/Joseph/My Documents/Programming fun/Python/Project Euler/18triangle.txt')

Triangle = []

for line in doc:
    Triangle.append( map( int, line.split() ) )

doc.close()

Triangle.reverse()

for i in xrange(len(Triangle) - 1):
    for j in xrange(len(Triangle[i]) - 1):              # Here it says that 'type int has no len'
        TEMP = compare(Triangle[i][j],Triangle[i][j + 1])
        Triangle[i+1] = TEMP

提前感谢您提供的任何建议。

4

3 回答 3

4

这看起来很可疑:

TEMP = compare(Triangle[i][j],Triangle[i][j + 1])
Triangle[i+1] = TEMP

Triangle以整数列表作为成员开始,但是当您经历时,您将元素分配为整数。事实上,除了 之外的每个元素都会发生这种情况Triangle[0],所以这总是会在i到达 时发生1


顺便说一句,这是阅读文档的一种更好的方式:

with open('C:/Users/Joseph/My Documents/Programming fun/Python/Project Euler/18triangle.txt') as doc:
    Triangle = [map(int, line.split()) for line in doc]

您的compare功能是标准max功能的子集;您可以改用它(正如@BrendenBrown 在评论中指出的那样)。

另外,Triangle应该triangle按照标准 Python 风格

于 2012-08-17T22:18:02.433 回答
1

问题是 TEMP 得到一个整数,然后你把它放到 Triangle 中,所以现在 Triangle 有一个整数而不是列表的元素。也许你想要类似的东西

Triangle[i+1] = [TEMP]

代替

Triangle[i+1] = TEMP
于 2012-08-17T22:18:26.613 回答
1

for i in xrange(len(Triangle) - 1)这不是很pythonic。

由于您想一次比较两个对象,因此首先调整列表可能会更好。此代码段将您的列表转换为 2 元组列表

>>> from itertools import izip_longest, islice
>>> x
[1, 2, 3, 4, 5]
>>> list(izip_longest(islice(x,0,None,2),islice(x,1,None,2)))
[(1, 2), (3, 4), (5, None)]

获得该格式的列表后,您可以像这样逐步完成它:

for i,j in two_list:
   # rest of your loop
于 2012-08-17T23:09:42.783 回答