如何修复:AttributeError:'int'对象没有属性'sort'

时间:2015-11-24 17:35:57

标签: python list sorting

所以我有这个代码并且你接受问卷调查,它会给你50分。结果是调查问卷的数据/结果所在的列表,对于每个人,它包含你的名字,分数(s如果您在元组中不止一次地接受问卷调查。它应该根据您的姓名按字母顺序打印数据,并从高分到低分打印。我已经通过在另一个程序中使用填充列表测试了这个,我将其插入到我的主代码中,我使用.dat文件,我得到你在标题中看到的错误。这是代码:

results = []
High_Scores = []
for x in results:
    temp = []
    y = i[1].sort(reverse=True)
    for i in reversed(x):
        temp.append(x)
    test2.append(temp)

results.sort()
High_Scores.sort(reverse=True)
print(results)
print(High_Scores)

以下是我在将其放入主代码之前所使用的代码:

    test = [[ "jeff", [48, 38] ], ["ted", [17, 26, 10] ], ["lol", [19]], ["lovely", [2]]]
    test2 = []
    for x in test:
        temp = []
        y = x[1].sort(reverse=True)
        for x in reversed(x):
             temp.append(x)
         test2.append(temp)

    test.sort()
    test2.sort(reverse=True)
    print(test)
    print(test2)

我试过了:

    results = []
    High_Scores = []
    High_Scores = sorted(results, key = lambda tup: tup[1], reverse = True)
    print (High_Scores)
    for x in results:
        temp = []
        y = x.sort(reverse=True)
        for i in reversed(x):
            temp.append(i)
        High_Scores.append(temp)

    results.sort()
    High_Scores.sort(reverse=True)
    print(results)
    print(High_Scores)

并将其视为错误:

  y = x.sort(reverse=True)
AttributeError: 'tuple' object has no attribute 'sort'

1 个答案:

答案 0 :(得分:1)

我认为您的错误是您在初始化之前尝试访问i。当您可能想要追加x时,您还会将i附加到temp。第y = x[1].sort(reverse=True)行是错误的,因为x[1]将是一个无法排序的int,这没有任何意义,但y = x.sort(reverse=True)会对内部进行排序列表,因为每个循环x等于内部列表。但是由于你使用元组,你的代码需要重新处理元组,我将解释

由于您有一个元组列表,第一个值是一个名称,您需要将分数与名称分开,将它们转换为列表以对其进行排序,将名称附加到已排序的分数,然后将其转换回到一个并非真正必要的元组但是我会做到这一点

results = [('A',1,2),('B',3,4),('C',5,6)]
High_Scores = [tuple([i[0]]+sorted(list(i[1:]), reverse=True)) for i in results]
print High_Scores

[('A', 2, 1), ('B', 4, 3), ('C', 6, 5)]

所有这一切都是为每个人排序得分。这是以更易读的形式列表理解

results = [('A',1,2),('B',3,4),('C',5,6)]
High_Scores = []
for i in results:
    tmp = sorted(list(i[1:]), reverse=True)
    tmp = [i[0]]+tmp
    High_Scores.append(tuple(tmp))
print High_Scores

现在,如果您想按名称排序,也可以

from operator import itemgetter
results = [('B',1,2),('C',3,4),('A',5,6)]
High_Scores = []

results = [list(i) for i in results]
High_Scores = sorted(results)
High_Scores = [[i[0]]+sorted(i[1:], reverse=True) for i in High_Scores]
print High_Scores

[['A', 6, 5], ['B', 2, 1], ['C', 4, 3]] #I didn't convert back to tuple

我会解释最后一个,因为它是最深入的。列表推导将元组的结果列表重构为列表列表。它需要每个元组并将它们放入list()函数中,该函数将元组转换为列表。接下来,它按照第一个值对结果内部列表进行排序。最后是列表推导,它循环遍历每个内部列表并从名称中分割得分并按相反的顺序对它们进行排序,然后将名称连接回分数。如果这没有意义,请在每行后添加打印语句以查看它发生了什么。