Python的.sort()函数不能按预期工作

12

在一个安静的周六晚上,我正在解决几个难题(好吧...并不是很开心),我在使用sort()函数时遇到了问题,结果并不如我所预期。该程序从100-999枚举每个组合,并检查它们的乘积是否为回文数。如果是,则将其添加到列表中。我需要对列表进行排序:D 这是我的程序:

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


2
这是来自Project Euler的,我想。 - J S
8个回答

25

你正在排序字符串,而不是数字。'101101' < '10201' 是因为 '1' < '2'。将 list.append(reversed) 改为 list.append(int(reversed)),这样就可以工作了(或使用其他排序函数)。


10
哦,天哪...就在我以为自己已经从新手变成初学者的时候;)谢谢! - Dominic Bou-Samra

13

排序在发挥其作用。如果您打算在列表中存储整数,请采用Lukáš的建议。您还可以告诉sort如何排序,例如通过使整数:

list.sort(key=int)

key参数接受一个函数,该函数计算一个元素以代替列表对象在所有比较中的位置。 整数将按您预期进行数字比较。

(顺便说一下,list是一个非常糟糕的变量名,因为它会覆盖内置的list()类型!)


2

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


1

不需要转换为int。mult已经是一个int类型,而且你已经检查过它是回文的,所以只需:

list.append(mult)

1

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


0

你的数字被存储为字符串,因此Python会相应地对它们进行排序。所以:'101x'在'102x'之前(就像'abcd'在'az'之前一样)。


0
不,它正在正确地排序,只是它正在按字典顺序排序,而您想要数字排序... 所以请删除 "str()"。

1
另外一个话题,你的程序可以进行优化。提示:生成数字... - aviraldg
是的,我知道,我可能会稍后编译它们,但对于手头的任务来说,这已经足够快了。 - Dominic Bou-Samra

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接