2009-10-03 80 views
7

在一个安静的星期六晚上解决一些难题(wooohoo ...不是),并且正在用sort()挣扎。结果不是我所期望的。该程序遍历100到999的每个组合,并检查产品是否是回文库。如果是,请附加到列表中。我需要排序列表:d这里是我的程序:Python .sort()不能按预期工作

list = [] #list of numbers 

for x in xrange(100,1000): #loops for first value of combination 
    for y in xrange(x,1000): #and 2nd value 
    mult = x*y 
    reversed = str(mult)[::-1] #reverses the number 
    if (reversed == str(mult)): 
     list.append(reversed) 

list.sort() 
print list[:10] 

其中网:

['101101', '10201', '102201', '102201', '105501', '105501', '106601', '108801', 
'108801', '110011'] 

显然指数0越大则1.任何想法是怎么回事?我有一种感觉,它与尾随/前导零有关,但我有一个快速的看,我看不出问题。

奖励积分,如果你知道在哪里的困惑来自:P

+1

回文队友 – whatnick 2009-10-03 13:26:59

+2

这是从项目欧拉,我想。 – 2009-10-03 14:01:21

+0

@ J S:宾果:D – 2009-10-03 14:14:32

回答

20

要排序的字符串,而不是数字。 '101101' < '10201',因为'1' < '2'。将list.append(reversed)更改为list.append(int(reversed)),它将工作(或使用不同的排序功能)。

+6

哦,伙计......正当我以为我是从新手到菜鸟毕业的;)谢谢! – 2009-10-03 13:27:01

0

你有你的号码存储为字符串,所以Python正在对它们进行相应的排序。因此:'101x'出​​现在'102x'之前(与'abcd'出现在'az'之前相同的方式)。

0

不,这是正确的排序,只是它是排序lexographically,你想数字排序...所以删除“STR()”

+1

在一个单独的主题上,您的程序可以进行优化。提示:**生成**数字.. – aviraldg 2009-10-03 13:29:53

+0

是的,我知道了,我可能会在稍后编译它们,但对于手头的任务来说足够快。 – 2009-10-03 14:13:33

1

你字符串进行排序,而不是数字。字符串比较从左到右。

2

您的列表包含字符串,所以它按字母顺序对它们进行排序 - 尝试将列表转换为整数,然后进行排序。

0

比较运算符将输入视为字符串而不是整数。在字符串比较2中,第三个字母在词汇上大于1. reversed = str(mult)[::-1]

11

Sort正在完成其工作。如果您打算将整数存储在列表中,请参阅Lukáš的建议。你也可以告诉排序如何通过使整数进行排序,例如:

list.sort(key=int) 

关键参数需要计算的项目采取的列表对象的位置在所有比较的功能。按照您的预期,整数将按数字进行比较。

(顺便说一句,list是一个非常糟糕的变量名,因为你覆盖内置列表()型!)

1

无需转换为int。 MULT已经是一个int,当你已经检查它是一个回文它的外观一样的逆转,所以才:

list.append(mult)