[请教]汉字数字排序的问题

已查看 0 次
跳至第一个未读帖子

马踏飞燕

未读,
2008年7月17日 22:31:152008/7/17
收件人 pyth...@googlegroups.com
我用Python的列表的sort方法对一组以汉字数字命名的文件名进行排序的时候发现是按照汉字的汉语拼音的字母在英文字母表里的顺序进行排序的。
这就导致了:
我要获得下面这个结果
一.txt
二.txt
三.txt
四.txt
五.txt
六.txt
但是却得到了
二.txt
六.txt
三.txt
四.txt
五.txt
一.txt

顺序完全不是我想要的。

请问有什么方法吗?

用途主要是把我在网络上抓回来的小说章节组合成一个文件,章节用的是汉字的数字,而且有好几百,手工做的话感觉太傻了。。。

--
免费手机铃声电子书下载,在线观看!
尽在 http://www.honeyday.org

Samuel Chi

未读,
2008年7月17日 22:39:282008/7/17
收件人 pyth...@googlegroups.com


2008/7/18 马踏飞燕 <honey...@gmail.com>:

我用Python的列表的sort方法对一组以汉字数字命名的文件名进行排序的时候发现是按照汉字的汉语拼音的字母在英文字母表里的顺序进行排序的。
这就导致了:
我要获得下面这个结果
一.txt
二.txt
三.txt
四.txt
五.txt
六.txt
但是却得到了
二.txt
六.txt
三.txt
四.txt
五.txt
一.txt

顺序完全不是我想要的。

这是因为汉字排序是按拼音排的


请问有什么方法吗?

用途主要是把我在网络上抓回来的小说章节组合成一个文件,章节用的是汉字的数字,而且有好几百,手工做的话感觉太傻了。。。
 
找一下把汉字数字转成阿拉伯数字的模块吧.
然后再排序了.

Her0

未读,
2008年7月17日 22:47:272008/7/17
收件人 python-cn`CPyUG`华蟒用户组
那启不是还有三百五十四之类的了?看来楼上说的找个转换模块是最简单的了!不然自己实现也麻烦阿!来个行者给出个主意!

Her0

未读,
2008年7月17日 22:52:092008/7/17
收件人 python-cn`CPyUG`华蟒用户组
还有我想不明白为什么不用字典阿?列表中好像汉字的数字和普通汉字一个地位阿!

On Jul 18, 10:31 am, "马踏飞燕" <honeyday...@gmail.com> wrote:

马踏飞燕

未读,
2008年7月17日 22:59:222008/7/17
收件人 pyth...@googlegroups.com
确实有。
完整的文件名是 <第四卷 第一百三十九章 飞天大虾(二).txt>
有很多地方有数字的。

在 08-7-18,Her0<react...@gmail.com> 写道:

Leo Jay

未读,
2008年7月17日 23:01:562008/7/17
收件人 pyth...@googlegroups.com
2008/7/18 马踏飞燕 <honey...@gmail.com>:

> 确实有。
> 完整的文件名是 <第四卷 第一百三十九章 飞天大虾(二).txt>
> 有很多地方有数字的。
>

那你还是老老实实找个转阿拉伯数字的模块吧。


--
Best Regards,
Leo Jay

realfun

未读,
2008年7月17日 23:02:092008/7/17
收件人 pyth...@googlegroups.com
以前写的Ruby代码,互转的,带测试用例,转成python应该不麻烦
用Ruby做中文数字和阿拉伯数字之间的互相转换 : http://www.fayaa.com/code/view/37/

2008/7/18 马踏飞燕 <honey...@gmail.com>:

确实有。
完整的文件名是 <第四卷 第一百三十九章 飞天大虾(二).txt>
有很多地方有数字的。

--
代码发芽网: http://www.fayaa.com/code/ (无需插件在blog上贴语法高亮的代码,百种语言,多种配色)
我的Blog: http://www.2maomao.com/blog

@@

未读,
2008年7月17日 23:04:052008/7/17
收件人 pyth...@googlegroups.com


2008/7/18 realfun <rea...@gmail.com>:

以前写的Ruby代码,互转的,带测试用例,转成python应该不麻烦
用Ruby做中文数字和阿拉伯数字之间的互相转换 : http://www.fayaa.com/code/view/37/

2008/7/18 马踏飞燕 <honey...@gmail.com>:
确实有。

完整的文件名是 <第四卷 第一百三十九章 飞天大虾(二).txt>
有很多地方有数字的。

dive into python的是罗马数字转换的
中文版的是不是应该弄一个汉字转换的 呵呵

马踏飞燕

未读,
2008年7月17日 23:21:182008/7/17
收件人 pyth...@googlegroups.com
我的神哪!ruby的语法咋有这么多的@#$%$^阿。。。头晕了。。。

在 08-7-18,realfun<rea...@gmail.com> 写道:

realfun

未读,
2008年7月17日 23:29:522008/7/17
收件人 pyth...@googlegroups.com
大部分由于ruby蹩脚的unicode处理功能导致,别管他

2008/7/18 马踏飞燕 <honey...@gmail.com>:
我的神哪!ruby的语法咋有这么多的@#$%$^阿。。。头晕了。。。

CL (Ciu Loeng) Lam

未读,
2008年7月18日 00:40:172008/7/18
收件人 pyth...@googlegroups.com
你可以自己建一张映射表不?用1对应一.txt,2对应二.txt,然后用阿拉伯数字排序,出来的顺序不就是中文的顺序了

2008/7/18 realfun <rea...@gmail.com>:

James liu

未读,
2008年7月18日 01:05:472008/7/18
收件人 pyth...@googlegroups.com
hash下把。。

2008/7/18 CL (Ciu Loeng) Lam <lamci...@gmail.com>:



--
regards
j.L

@@

未读,
2008年7月18日 01:07:482008/7/18
收件人 pyth...@googlegroups.com
小说不过过1000章吧
自己把所有1~1000都弄个字典就行了

2008/7/18 James liu <liupin...@gmail.com>:

马踏飞燕

未读,
2008年7月18日 02:49:112008/7/18
收件人 pyth...@googlegroups.com
自己动手,丰衣足食!
我写了一个转换用的函数,贴上来分享一下:

#coding=UTF-8
#用途:把用汉字表示的数字转换为阿拉伯数字
#用法:cn2dig(汉字数字)
#作者:马踏飞燕<honey...@gmail.com>
#日期:2008-07-18

CN_NUM = {
u'〇' : 0,
u'一' : 1,
u'二' : 2,
u'三' : 3,
u'四' : 4,
u'五' : 5,
u'六' : 6,
u'七' : 7,
u'八' : 8,
u'九' : 9,

u'零' : 0,
u'壹' : 1,
u'贰' : 2,
u'叁' : 3,
u'肆' : 4,
u'伍' : 5,
u'陆' : 6,
u'柒' : 7,
u'捌' : 8,
u'玖' : 9,

u'貮' : 2,
u'两' : 2,
}
CN_UNIT = {
u'十' : 10,
u'拾' : 10,
u'百' : 100,
u'佰' : 100,
u'千' : 1000,
u'仟' : 1000,
u'万' : 10000,
u'萬' : 10000,
u'亿' : 100000000,
u'億' : 100000000,
u'兆' : 1000000000000,
}
def cn2dig(cn):
lcn = list(cn)
unit = 0 #当前的单位
ldig = []#临时数组
while lcn:
cndig = lcn.pop()
if CN_UNIT.has_key(cndig):
unit = CN_UNIT.get(cndig)
if unit==10000:
ldig.append('w') #标示万位
unit = 1
elif unit==100000000:
ldig.append('y') #标示亿位
unit = 1
elif unit==1000000000000:#标示兆位
ldig.append('z')
unit = 1
continue
else:
dig = CN_NUM.get(cndig)
if unit:
dig = dig*unit
unit = 0
ldig.append(dig)
#print ldig #uncomment this line to watch the middle var.
ret = 0
tmp = 0
while ldig:
x = ldig.pop()
if x=='w':
tmp *= 10000
ret += tmp
tmp=0
elif x=='y':
tmp *= 100000000
ret += tmp
tmp=0
elif x=='z':
tmp *= 1000000000000
ret += tmp
tmp=0
else:
tmp += x
ret += tmp
return ret
#ldig.reverse()
#print ldig
#print CN_NUM[u'七']


if __name__ == '__main__':
#just for test
test_dig = [u'二十一',
u'一百二十三',
u'一千二百零三',
u'一万一千一百零一',
u'十万零三千六百零九',
u'一百二十三万四千五百六十七',
u'一千一百二十三万四千五百六十七',
u'一亿一千一百二十三万四千五百六十七',
u'一百零二亿五千零一万零一千零三十八',
u'一千一百一十一亿一千一百二十三万四千五百六十七',
u'一兆一千一百一十一亿一千一百二十三万四千五百六十七',
]
for cn in test_dig:
print cn2dig(cn)

cn2dig.py

realfun

未读,
2008年7月18日 02:59:102008/7/18
收件人 pyth...@googlegroups.com
呵呵不错,贴到这儿了:http://www.fayaa.com/code/view/190/

2008/7/18 马踏飞燕 <honey...@gmail.com>:

自己动手,丰衣足食!
我写了一个转换用的函数,贴上来分享一下:

#coding=UTF-8
#用途:把用汉字表示的数字转换为阿拉伯数字
#用法:cn2dig(汉字数字)
#作者:马踏飞燕<honey...@gmail.com>
#日期:2008-07-18

CN_NUM = {
 u'〇' : 0,
 u'一' : 1,

James liu

未读,
2008年7月18日 02:59:392008/7/18
收件人 pyth...@googlegroups.com
一零二四章,,运行你程序结果是什么?

2008/7/18 马踏飞燕 <honey...@gmail.com>:



--
regards
j.L

马踏飞燕

未读,
2008年7月18日 03:00:442008/7/18
收件人 pyth...@googlegroups.com
我晕... 手真快啊...
我刚把用户注册完,打算往里面贴呢....

在 08-7-18,realfun<rea...@gmail.com> 写道:

马踏飞燕

未读,
2008年7月18日 03:03:212008/7/18
收件人 pyth...@googlegroups.com
出错!
这个应该不算是正确的汉字数字表示法阿

应该说成: 一千零二十四章

一零二四 的话就太简单了,每一位对应查表,然后按位连接就行了.

在 08-7-18,James liu<liupin...@gmail.com> 写道:

realfun

未读,
2008年7月18日 03:05:422008/7/18
收件人 pyth...@googlegroups.com
好吧,我删掉了 :)

2008/7/18 马踏飞燕 <honey...@gmail.com>:
我晕... 手真快啊...
我刚把用户注册完,打算往里面贴呢....

马踏飞燕

未读,
2008年7月18日 03:11:112008/7/18
收件人 pyth...@googlegroups.com
我狂晕...
我刚写了一个评论... 一提交,发现你把原贴删了...

我贴新的进去,发现网站报错了.

http://www.fayaa.com/code/view/191/ 这个地址报错了,你看看.

在 08-7-18,realfun<rea...@gmail.com> 写道:

realfun

未读,
2008年7月18日 03:15:182008/7/18
收件人 pyth...@googlegroups.com
Design Issue,晚上再改吧,当初设计的时候有个假设就是没人能删帖
结果自己刚才违反了这个原则....

2008/7/18 马踏飞燕 <honey...@gmail.com>:

James liu

未读,
2008年7月18日 03:17:472008/7/18
收件人 pyth...@googlegroups.com
我天天看玄幻,,,这样写应该满多的,生活中哪儿有那么多有规律的。



2008/7/18 马踏飞燕 <honey...@gmail.com>:

出错!
这个应该不算是正确的汉字数字表示法阿

应该说成: 一千零二十四章

一零二四 的话就太简单了,每一位对应查表,然后按位连接就行了.




--
regards
j.L

马踏飞燕

未读,
2008年7月18日 03:20:592008/7/18
收件人 pyth...@googlegroups.com
我看的是《藏地密码》,号码编的相当规范。。。现在已经160多章放出来了,爽阿!

在 08-7-18,James liu<liupin...@gmail.com> 写道:

James liu

未读,
2008年7月18日 03:22:342008/7/18
收件人 pyth...@googlegroups.com
我现在"龙蛇演义", "神墓", "无极魔道"


--
regards
j.L

realfun

未读,
2008年7月18日 03:24:302008/7/18
收件人 pyth...@googlegroups.com
算了,直接在后台改了,已经搞定,参见:http://www.fayaa.com/code/view/192/
190和191被黑掉了

2008/7/18 realfun <rea...@gmail.com>:

Design Issue,晚上再改吧,当初设计的时候有个假设就是没人能删帖
结果自己刚才违反了这个原则....

2008/7/18 马踏飞燕 <honey...@gmail.com>:
我狂晕...
我刚写了一个评论... 一提交,发现你把原贴删了...

我贴新的进去,发现网站报错了.

http://www.fayaa.com/code/view/191/   这个地址报错了,你看看.

limodou

未读,
2008年7月18日 03:25:512008/7/18
收件人 pyth...@googlegroups.com
2008/7/18 马踏飞燕 <honey...@gmail.com>:

> 我看的是《藏地密码》,号码编的相当规范。。。现在已经160多章放出来了,爽阿!
>

这么说来你是将下载的章节进行排序吗?如果不考虑转换汉字,通过目录页面就可以知道顺序。

--
I like python!
UliPad <<The Python Editor>>: http://code.google.com/p/ulipad/
UliWeb <<simple web framework>>: http://uliwebproject.appspot.com
My Blog: (new)http://http://hi.baidu.com/limodou
(old)http://www.donews.net/limodou

realfun

未读,
2008年7月18日 03:26:532008/7/18
收件人 pyth...@googlegroups.com
从来只看成品的:
 母皇
 罪恶(强烈推荐,Google"罪恶 刺岩卡"
 寻找人类


2008/7/18 James liu <liupin...@gmail.com>:
我现在"龙蛇演义", "神墓", "无极魔道"

--

Samuel Chi

未读,
2008年7月18日 04:47:092008/7/18
收件人 pyth...@googlegroups.com
GREAT!

Samuel Chi

未读,
2008年7月18日 04:50:232008/7/18
收件人 pyth...@googlegroups.com


2008/7/18 realfun <rea...@gmail.com>:

从来只看成品的:
 母皇
 罪恶(强烈推荐,Google"罪恶 刺岩卡"
 寻找人类

跟着跑:
   冠军教父
   人欲
   猛兽记
   史上第一混乱
   e轮回
顺便也推荐几个成品:
   圣徒
   历史的尘埃

limodou

未读,
2008年7月18日 05:43:202008/7/18
收件人 pyth...@googlegroups.com
2008/7/18 Samuel Chi <princeofd...@gmail.com>:

这么多,何时能看完!

马踏飞燕

未读,
2008年7月18日 05:46:212008/7/18
收件人 pyth...@googlegroups.com
在 08-7-18,limodou<lim...@gmail.com> 写道:

> 2008/7/18 马踏飞燕 <honey...@gmail.com>:
> > 我看的是《藏地密码》,号码编的相当规范。。。现在已经160多章放出来了,爽阿!
> >
>
> 这么说来你是将下载的章节进行排序吗?如果不考虑转换汉字,通过目录页面就可以知道顺序。
>

确实,但是我为了偷懒,就用迅雷下的单个页面,回来后的顺序就乱了。

Samuel Chi

未读,
2008年7月18日 08:18:122008/7/18
收件人 pyth...@googlegroups.com


2008/7/18 limodou <lim...@gmail.com>:

2008/7/18 Samuel Chi <princeofd...@gmail.com>:
>
>
> 2008/7/18 realfun <rea...@gmail.com>:
>>
>> 从来只看成品的:
>>  母皇
>>  罪恶(强烈推荐,Google"罪恶 刺岩卡")
>>  寻找人类
>
> 跟着跑:
>    冠军教父
>    人欲
>    猛兽记
>    史上第一混乱
>    e轮回
> 顺便也推荐几个成品:
>    圣徒
>    历史的尘埃
>

这么多,何时能看完!

每天下班前后抓紧时间看十来章~

马踏飞燕

未读,
2008年7月18日 11:19:322008/7/18
收件人 pyth...@googlegroups.com
之前发的代码有个小bug,重发一个。
之前的不能正确处理10-19之间的数字。
cn2dig.py

Her0

未读,
2008年7月18日 15:10:102008/7/18
收件人 python-cn`CPyUG`华蟒用户组
我在想要是汉字如果不是utf-8的你这个会转化成什么样呢?如果不想完善你的代码。就修改一下注释!毕竟gbk转utf-8可以单独做!我可不是鸡蛋
里面跳骨头哈!我是看楼主这么认真写代码才说的哈!
> cn2dig.py
> 3K下载

马踏飞燕

未读,
2008年7月18日 21:56:282008/7/18
收件人 pyth...@googlegroups.com
确切地说,那个函数是处理unicode的。
一般来说,我在处理文本的过程中都是先转换为unicode的。
unicode(rawdata,'UTF-8','ignore')
unicode(rawdata,'GBK','ignore')
除了这两个也没啥特殊的了。

在 08-7-19,Her0<react...@gmail.com> 写道:

realfun

未读,
2008年7月19日 00:33:292008/7/19
收件人 pyth...@googlegroups.com
也更新一下这里吧,谢谢:
http://www.fayaa.com/code/view/192/

2008/7/19 马踏飞燕 <honey...@gmail.com>:

23号

未读,
2008年7月20日 22:55:272008/7/20
收件人 pyth...@googlegroups.com
good.
> #coding=UTF-8
> #????????????????????????????????????????????????????????????
> #?????????cn2dig(????????????)
> #?????????????????????<honey...@gmail.com>
> #?????????2008-07-18
>
> CN_NUM = {
> u'???' : 0,
> u'???' : 1,
> u'???' : 2,
> u'???' : 3,
> u'???' : 4,
> u'???' : 5,
> u'???' : 6,
> u'???' : 7,
> u'???' : 8,
> u'???' : 9,
>
> u'???' : 0,
> u'???' : 1,
> u'???' : 2,
> u'???' : 3,
> u'???' : 4,
> u'???' : 5,
> u'???' : 6,
> u'???' : 7,
> u'???' : 8,
> u'???' : 9,
>
> u'???' : 2,
> u'???' : 2,
> }
> CN_UNIT = {
> u'???' : 10,
> u'???' : 10,
> u'???' : 100,
> u'???' : 100,
> u'???' : 1000,
> u'???' : 1000,
> u'???' : 10000,
> u'???' : 10000,
> u'???' : 100000000,
> u'???' : 100000000,
> u'???' : 1000000000000,
> }
> def cn2dig(cn):
> lcn = list(cn)
> unit = 0 #???????????????
> ldig = []#????????????
> while lcn:
> cndig = lcn.pop()
> if CN_UNIT.has_key(cndig):
> unit = CN_UNIT.get(cndig)
> if unit==10000:
> ldig.append('w') #????????????
> unit = 1
> elif unit==100000000:
> ldig.append('y') #????????????
> unit = 1
> elif unit==1000000000000:#????????????
> #print CN_NUM[u'???']
>
>
> if __name__ == '__main__':
> #just for test
> test_dig = [u'?????????',
> u'???????????????',
> u'??????????????????',
> u'????????????????????????',
> u'???????????????????????????',
> u'???????????????????????????????????????',
> u'?????????????????????????????????????????????',
> u'???????????????????????????????????????????????????',
> u'???????????????????????????????????????????????????',
> u'?????????????????????????????????????????????????????????????????????',
> u'???????????????????????????????????????????????????????????????????????????',
> ]
> for cn in test_dig:
> print cn2dig(cn)


--
Best Regards,
No.23
----
My Blog: http://n23.appspot.com/blog/
回复全部
回复作者
转发
0 个新帖子