Python中,如何对中文按拼音排序?

http://blog.csdn.net/jollyjum...

    import locale
    
    locale.setlocale('LC_COLLATE', 'zh_CN.UTF8')
    a = ['中国人', '啊', '你好', '台湾人']
    b = sorted(a, cmp=locale.strcoll)
    print b

按照该链接的方法,会提示

Traceback (most recent call last):
  File "D:/Documents and Settings/Desktop/�Ʋ�ѯ/test.py", line 76, in <module>
    locale.setlocale('LC_COLLATE', 'zh_CN.UTF8')
  File "C:\Python27\lib\locale.py", line 579, in setlocale
    return _setlocale(category, locale)
TypeError: an integer is required
阅读 16.8k
6 个回答
新手上路,请多包涵

对中文进行gbk编码排序

a = ['完','莫', 'm', '莫啊里','啊','a', '赵']
out = sorted(a, key=lambda x: x.encode('gbk'))  # ['a', 'm', '啊', '莫', '莫啊里', '完', '赵']

可以先把中文转换成拼音再进行排序

# coding: utf-8

from __future__ import unicode_literals

from pypinyin import lazy_pinyin

a = ['中国人', '啊', '你好', '台湾人']
b = [''.join(lazy_pinyin(_)) for _ in a]
print sorted(b)

'LC_COLLATE' -> locale.LC_COLLATE

我东凑西凑找来的暂时可以用的方案
mac电脑上的locale查出来是zh_CN.UTF-8有个横杠
然后py3上不能用cmp了,只能用key
但是这样做我的mac还是无法按拼音排序,我的城市名排序依旧是‘上海’在最前面
然后我发现,这和默认的排序并无差别

import locale
import functools
locale.setlocale(locale.LC_COLLATE, 'zh_CN.UTF-8')
sort_list = sorted(XXX,key=functools.cmp_to_key(locale.strcoll))
# -*- coding: utf-8 -*-
# @Author  : XerCis
# @Function: 中文排序
from itertools import chain
from pypinyin import pinyin, Style


def to_pinyin(s):
    '''转拼音

    :param s: 字符串或列表
    :type s: str or list
    :return: 拼音字符串
    >>> to_pinyin('你好吗')
    'ni3hao3ma'
    >>> to_pinyin(['你好', '吗'])
    'ni3hao3ma'
    '''
    return ''.join(chain.from_iterable(pinyin(s, style=Style.TONE3)))


print(sorted(['美国', '中国', '日本']))  # 美m 中z 日r abcdefghijkl[m]nopq[r]stuvwsy[z]
# ['中国', '日本', '美国']
print(sorted(['美国', '中国', '日本'], key=to_pinyin))  # 美m 中z 日r abcdefghijkl[m]nopq[r]stuvwsy[z]
# ['美国', '日本', '中国']
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏