为什么我没有按预期顺序获得排序函数的结果?

时间:2011-10-17 18:55:04

标签: python sorting

print activities
activities  = sorted(activities,key = lambda item:item[1])
print activities

这种情况下的活动是像(start_number,finish_number)这样的元组列表,根据我的上述代码的输出应该是根据finish_number的递增顺序排序的值列表。当我在shell中尝试上面的代码时,得到了以下输出。我不确定为什么第二个列表没有根据finish_number的递增顺序排序。请帮助我理解这一点。

[('1', '4'), ('3', '5'), ('0', '6'), ('5', '7'), ('3', '9'), ('5', '9'), ('6', '10'), ('8', '11'), ('8', '12'), ('2', '14'), ('12', '16')]
[('6', '10'), ('8', '11'), ('8', '12'), ('2', '14'), ('12', '16'), ('1', '4'), ('3', '5'), ('0', '6'), ('5', '7'), ('3', '9'), ('5', '9')]

5 个答案:

答案 0 :(得分:6)

您正在排序字符串而不是整数:在这种情况下,104“更小”。要对整数进行排序,请将其转换为:

activites = sorted(activities,key = lambda item:int(item[1]))
print activities

结果:

[('1', '4'), ('3', '5'), ('0', '6'), ('5', '7'), ('3', '9'), ('5', '9'), ('6', '10'), ('8', '11'), ('8', '12'), ('2', '14'), ('12', '16')]

答案 1 :(得分:6)

您的商品将被比较为字符串,而不是数字。因此,由于1字符按字典顺序排在4之前,因此10出现在4之前是有道理的。

您需要先将值转换为int:

activities  = sorted(activities,key = lambda item:int(item[1]))

答案 2 :(得分:2)

您正在排序字符串,而不是数字。字符串按字符排序。

因此,例如'40'大于'100',因为字符4大于1

您可以通过简单地将项目转换为整数来动态修复此问题。

 activities  = sorted(activities,key = lambda item: int(item[1]))

答案 3 :(得分:1)

这是因为您不是将数字存储为数字,而是存储为字符串。字符串'10'位于字符串'2'之前。尝试:

activities = sorted(activities, key=lambda i: int(i[1]))

答案 4 :(得分:1)

寻找问题的更广泛的解决方案:在输入时立即将您的数据从str转换为int,并将其作为int使用(否则您将会不断遇到这样的小问题,并将数据格式化为str以便输出。

这个原则通常适用,例如:使用非ASCII字符串数据时,请执行UTF-8 - > unicode - > UTF-8;不要试图操纵未解码的文本。