python 拼音排序 中文_sqlalchemy & python & datatables & javascript 中文拼音排序

近期有中文拼单排序需要,查询资料,mysql数据库有convert函数支持

select cname from channel order by convert(cname using gbk);

# cname字段使用utf8,默认的话,汉字转换为uft8码,然后再排序,顺序肯定有问题。使用convert将汉字转为gbk,就符合拼音排序

# https://datatables.net/plug-ins/sorting/

datatables的自定义排序,只作用于客户端页面排序,后台排序不适用。

我的程序涉及接口、datatable页面,需要变更后台程序。使用pypinyin模块进行中英文混排,因为使用了sqlalchemy,在order_by的时候,必须用cast函数将字段进行转换。

比如 字符数字变更为数字等,中文字符utf8转为中文拼音 。

sqlalchemy 没有定义convert函数,仅支持cast函数,我开始使用 cast(T.name, Custom)自定义列类型,失败,数据库层面排序实现困难。

改变思路,在返回结果,进行排序处理。

# 返回datatable数据

data = [{

'uuid': q.uuid,

'name': q.name,

'cname': q.cname,

'tname': q.tname,

'category': q.category,

'sort_id': q.sort_id,

'product': q.product,

'status': q.status,

'create_time': q.create_time,

'update_time': q.update_time

} for q in query.items]

# 排序, 支持中文排序

reverse = False if order == 'asc' else True

if order_name in ['product']:

data = sorted(data, key=lambda k: len(k[order_name].split(',')) if k[order_name] else '', reverse=reverse)

elif order_name in ['sort_id']:

data = sorted(data, key=lambda k: (len(k[order_name]), k[order_name]) if k[order_name] else '', reverse=reverse)

elif order_name in ['cname', 'tname', 'category']:

data = sorted(data, key=lambda k: lazy_pinyin(k[order_name]) if k[order_name] else '', reverse=reverse)

else:

data = sorted(data, key=lambda k: k[order_name], reverse=reverse)

其中有个小插曲,自然排序,一条语句搞定,神来之笔是生成位数与数据的元组,先比较位数,同位数再比较内容。

data = ['10', 'a2', '45', 'b32', '9', '0']

sorted(data, key=lambda x: (len(x), x))

['0', '9', '10', '45', 'a2', 'b32']

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值