无法在python中对unicode数字进行排序

时间:2014-01-11 22:28:15

标签: python

以下是从python shell发出的:

>>> import locale
>>> locale.setlocale(locale.LC_ALL, '')
'English_United States.1252'
>>> c = [u'9', u'9', u'54', u'51', u'48', u'48', u'47', u'46', u'46', u'45', u'44', u'44', u'43', u'43', u'43', u'42', u'42', u'41', u'41', u'41', u'41', u'41', u'40', u'38', u'38', u'38', u'38', u'37', u'37', u'37', u'36', u'36', u'36', u'36', u'35', u'35', u'35', u'35', u'35', u'35', u'35', u'34', u'34', u'33', u'33', u'33', u'33', u'33', u'32', u'32', u'32', u'31', u'31', u'31', u'30', u'30', u'29', u'29', u'29', u'29', u'29', u'29', u'29', u'26', u'26', u'25', u'25', u'25', u'24', u'24', u'24', u'24', u'23', u'2', u'17', u'16', u'12', u'1', u'1', u'1', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0']
>>> sorted(c,locale.strcoll)
[u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'1', u'1', u'1', u'12', u'16', u'17', u'2', u'23', u'24', u'24', u'24', u'24', u'25', u'25', u'25', u'26', u'26', u'29', u'29', u'29', u'29', u'29', u'29', u'29', u'30', u'30', u'31', u'31', u'31', u'32', u'32', u'32', u'33', u'33', u'33', u'33', u'33', u'34', u'34', u'35', u'35', u'35', u'35', u'35', u'35', u'35', u'36', u'36', u'36', u'36', u'37', u'37', u'37', u'38', u'38', u'38', u'38', u'40', u'41', u'41', u'41', u'41', u'41', u'42', u'42', u'43', u'43', u'43', u'44', u'44', u'45', u'46', u'46', u'47', u'48', u'48', u'51', u'54', u'9', u'9']

输出未排序。有u'16', u'17', u'2'然后是u'23'

不知道这里发生了什么。有人可以帮忙吗?

6 个答案:

答案 0 :(得分:3)

您需要按数字排序,而不是文本。试试这个:

myList.sort(key=int)

int函数在排序之前在每个元素中运行,强制它将字符串排序为整数。

答案 1 :(得分:3)

令人着迷的是,优雅而简洁的sorted()包含了多少。来自文档,http://docs.python.org/2/library/functions.html#sorted

  

key指定用于提取a的一个参数的函数   每个列表元素的比较键:key = str.lower。默认   value为None(直接比较元素)。

因此,在调用sorted()时,可以在列表中强制转换元素:

>>> c = [u'9', u'9', u'54', u'51', u'48', u'48', u'47', u'46', u'46', u'45', u'44', u'44', u'43', u'43', u'43', u'42', u'42', u'41', u'41', u'41', u'41', u'41', u'40', u'38', u'38', u'38', u'38', u'37', u'37', u'37', u'36', u'36', u'36', u'36', u'35', u'35', u'35', u'35', u'35', u'35', u'35', u'34', u'34', u'33', u'33', u'33', u'33', u'33', u'32', u'32', u'32', u'31', u'31', u'31', u'30', u'30', u'29', u'29', u'29', u'29', u'29', u'29', u'29', u'26', u'26', u'25', u'25', u'25', u'24', u'24', u'24', u'24', u'23', u'2', u'17', u'16', u'12', u'1', u'1', u'1', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0']
>>> sorted(c, key=int)
[u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'1', u'1', u'1', u'2', u'9', u'9', u'12', u'16', u'17', u'23', u'24', u'24', u'24', u'24', u'25', u'25', u'25', u'26', u'26', u'29', u'29', u'29', u'29', u'29', u'29', u'29', u'30', u'30', u'31', u'31', u'31', u'32', u'32', u'32', u'33', u'33', u'33', u'33', u'33', u'34', u'34', u'35', u'35', u'35', u'35', u'35', u'35', u'35', u'36', u'36', u'36', u'36', u'37', u'37', u'37', u'38', u'38', u'38', u'38', u'40', u'41', u'41', u'41', u'41', u'41', u'42', u'42', u'43', u'43', u'43', u'44', u'44', u'45', u'46', u'46', u'47', u'48', u'48', u'51', u'54']

或者,有一个natsort库,https://pypi.python.org/pypi/natsort

>>> import natsort
>>> c = [u'9', u'9', u'54', u'51', u'48', u'48', u'47', u'46', u'46', u'45', u'44', u'44', u'43', u'43', u'43', u'42', u'42', u'41', u'41', u'41', u'41', u'41', u'40', u'38', u'38', u'38', u'38', u'37', u'37', u'37', u'36', u'36', u'36', u'36', u'35', u'35', u'35', u'35', u'35', u'35', u'35', u'34', u'34', u'33', u'33', u'33', u'33', u'33', u'32', u'32', u'32', u'31', u'31', u'31', u'30', u'30', u'29', u'29', u'29', u'29', u'29', u'29', u'29', u'26', u'26', u'25', u'25', u'25', u'24', u'24', u'24', u'24', u'23', u'2', u'17', u'16', u'12', u'1', u'1', u'1', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0']
>>> natsort.natsorted(c)
[u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'1', u'1', u'1', u'2', u'9', u'9', u'12', u'16', u'17', u'23', u'24', u'24', u'24', u'24', u'25', u'25', u'25', u'26', u'26', u'29', u'29', u'29', u'29', u'29', u'29', u'29', u'30', u'30', u'31', u'31', u'31', u'32', u'32', u'32', u'33', u'33', u'33', u'33', u'33', u'34', u'34', u'35', u'35', u'35', u'35', u'35', u'35', u'35', u'36', u'36', u'36', u'36', u'37', u'37', u'37', u'38', u'38', u'38', u'38', u'40', u'41', u'41', u'41', u'41', u'41', u'42', u'42', u'43', u'43', u'43', u'44', u'44', u'45', u'46', u'46', u'47', u'48', u'48', u'51', u'54']

尤其是当您的元素包含一些非数字字符串时。

>>> x = ['foo12', 'foo1', 'foo2','foo24']
>>> natsort.natsorted(x)
['foo1', 'foo2', 'foo12', 'foo24']

答案 2 :(得分:2)

字符串以lexicographic order排序。当你知道这是sort函数的工作方式时,就会产生输出。

看来你正在寻找的是一种自然的。我建议你看一下natsort package

或者,您可以为排序实现自己的比较操作。

答案 3 :(得分:1)

据推测,您希望它们按数字顺序排序。你可以尝试这样的事情。 c是您之前的字符串列表。您有两种选择,第一种:

sorted_c=sorted(c, key=float)

没有键功能,python会将这些数字排序为 strings 。由于'10''7'之前是按字母顺序(毕竟它以1开头),因此sort函数会将之前的放在列表中。

答案 4 :(得分:0)

你需要双重贬低:

map(unicode, sorted(map(int, c)))

答案 5 :(得分:-1)

他们是字符串。字符串按字母顺序排序。 16,17,2,23正确排序为字符串。