如何sortingstring列表?

在Python中创build按字母sorting的列表的最佳方式是什么?

基本答案:

 mylist = ["b", "C", "A"] mylist.sort() 

这会修改你的原始列表(即就地sorting)。 要获取列表的已sorting副本,而不更改原始内容,请使用sorted()函数:

 for x in sorted(mylist): print x 

但是,上面的例子有点幼稚,因为它们不考虑区域设置,并执行区分大小写的sorting。 您可以利用可选参数key来指定自定义sorting顺序(使用cmp替代方法是一个不推荐使用的解决scheme,因为必须多次评估 – 每个元素只能计算一次key )。

因此,要根据当前的语言环境进行sorting,并考虑语言特定的规则( cmp_to_key是functools的帮助函数):

 sorted(mylist, key=cmp_to_key(locale.strcoll)) 

最后,如果你需要,你可以指定一个自定义的语言环境进行sorting:

 import locale locale.setlocale(locale.LC_ALL, 'en_US.UTF-8') # vary depending on your lang/locale assert sorted((u'Ab', u'ad', u'aa'), key=cmp_to_key(locale.strcoll)) == [u'aa', u'Ab', u'ad'] 

最后一点:您将看到使用lower()方法的不区分大小写sorting的示例 – 这些示例不正确,因为它们只能用于ASCII字符集。 这两个对于任何非英文数据都是错误的:

 # this is incorrect! mylist.sort(key=lambda x: x.lower()) # alternative notation, a bit faster, but still wrong mylist.sort(key=str.lower) 

还有一点值得注意的是sorted()函数:

 for x in sorted(list): print x 

这将返回一个列表的新sorting版本,而不会更改原始列表。

 list.sort() 

这真的是这么简单:)

sortingstring的正确方法是:

 import locale locale.setlocale(locale.LC_ALL, 'en_US.UTF-8') # vary depending on your lang/locale assert sorted((u'Ab', u'ad', u'aa'), cmp=locale.strcoll) == [u'aa', u'Ab', u'ad'] # Without using locale.strcoll you get: assert sorted((u'Ab', u'ad', u'aa')) == [u'Ab', u'aa', u'ad'] 

mylist.sort(key=lambda x: x.lower())的前面的例子对于仅ASCII的上下文将正常工作。

但是,这是如何处理语言特定的sorting规则? 是否考虑到区域设置?

不, list.sort()是一个通用的sortingfunction。 如果您想根据Unicode规则进行sorting,则必须定义一个自定义sorting键function。 你可以尝试使用pyuca模块,但我不知道它有多完整。

假设s =“ZWzaAd”,为了sorting这个string,简单的解决scheme将在下面的一个。 print''.join(sorted(s)