我有一个包含数字行的文本文件。我的程序试图提取代码行并将它们放在一个列表中,每个列表由组成文件中该行的数字组成,然后将所有这些列表放入一个列表(让我们调用)这个Triangle)并且有一个应用于它们的函数,但Python解释器说当我尝试使用它时Triangle[x]
是一个整数类型,但当我问它时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
提前感谢您提供任何建议。
答案 0 :(得分: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所指出的那样)。
此外,根据standard Python style,Triangle
应为triangle
。
答案 1 :(得分:1)
问题是TEMP得到一个整数,然后你把它放到Triangle中,所以现在Triangle有一个整数而不是列表的元素。也许你想要像
这样的东西Triangle[i+1] = [TEMP]
而不是
Triangle[i+1] = TEMP
答案 2 :(得分: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