Recently in Python Category

Unicode编码中的简繁中文互转

| No Comments | No TrackBacks

现在简繁中文的转换已经不像从前那样,是gbk/ big5两种文字编码之间的转换,而是在同一个编码,Unicode,当中不同编码的映射。当然,简繁中文绝对不是简单的一一对应关系,有一对多的个别情 况,例如简体的"后" 对应繁体的 "后"和"後"。行业词汇也有差别,例如大陆说"宽带",而港台说"寬頻";大陆说"操作系统",而港台说"作業系統" 等等。

因此当我决定用Python程序将森海塞尔简体中文网站转换为繁体中文网站时,我的计划分三个步骤:

  1. 提取行业高频关键字,找到简体和繁体的对应,编成词典
  2. 利用现有的Python中文本地化工具包,将关键字之外的文字转换
  3. 请港台Freelancer人工校对,确保本土化

第一步,我的词典替换程序在此:

#coding:utf8
import sys

_dict = {'森海塞尔': 'Sennheiser', '耳机': '耳筒', '通通讯耳机': '通話用耳機', '话筒': '咪高峰', '包耳式': '包圍耳殼式', '换能原理': '單元原理', '阻抑': '隔離',
'便携包': '便攜袋', '质保': '保用', '带宽': '頻寬', '调制方式': '調節方式', '信噪比': '訊噪比', '杂散辐射': '雜散發射' }

_dict_s2t = dict((k, v) for k, v in _dict.iteritems())
_dict_t2s = dict((v, k) for k, v in _dict.iteritems())

def translate2traditional(data):

for k, v in _dict_s2t.iteritems():
data = data.replace(k, v)
return data

def translate2simplified(data):

for k, v in _dict_t2s.iteritems():
data = data.replace(k, v)
return data

def test_dict():

global _dict_s2t, _dict_t2s
for k, v in _dict_s2t.iteritems():
print k, v

for k, v in _dict_t2s.iteritems():
print k, v

if __name__ == '__main__':

if len(sys.argv) > 2:
f = open(sys.argv[2], 'r')
if sys.argv[1] == 's2t':
print translate2traditional(f.read())
elif sys.argv[1] == 't2s':
print translate2simplified(f.read())
else:
print 'Wrong operation type.'
else:
print 'usage: python trans_dict.py [s2t | t2s] file.name'

第二步,我利用的是pyzh中文工具包中的fanjian.py完成。特别感谢pyzh项目组的全部成员和fanjian.py程序作者ne.manman和zsp007!

下面就交给香港的朋友了,希望不会累坏他:)

顺便说,Songbird很不错,有点山寨iTunes,那又怎样呢?毕竟Linux下面还没iTunes。


Songbird

从6.7到0.01

| No Comments | No TrackBacks

编程果然不能偷懒!我这一偷懒,CPU就不知道要受多少累、冒多少热气了。一开始,我采用了很无脑的穷举方法,复杂度是O(n**2),结果肯定正确的,但是长度一万的数组就可以耗去6.7秒的CPU时间。

raymond@raymond-laptop:~/_Work/Dev/python$ python le.py
time:  0:00:06.708924
return:  1 0 0 0

之后,在高手提示下将复杂度降低到n (log n + 1) ,结果不错了。

raymond@raymond-laptop:~/_Work/Dev/python$ python le.py
time:  0:00:00.010430
return:  1 0 0 0

对应改进后的代码:

def leader3(array):
t = len(array) //2
array.sort()
p = -1
c = 1
for i in array:
if p == i :
c+=1
if c > t:
return 1
else :
p = i
c = 1
#print i, p, c

return 0

这是我要记住的一课。

偷闲,写了个初级二叉树排序

| No Comments | No TrackBacks

二叉树是计算机算法中普遍采用的数据结构。在所有排序算法中具有高效率的二叉树排序就是基于此结构。我抽空用新学的Python写了一个试试:

class node:
left = None
right = None
value = 0

def __init__(self, v):
self.value = v

def walk(self):
r = []
if self.left:
r.extend(self.left.walk())
r.append(self.value)
if self.right:
r.extend(self.right.walk())
return r

def insert(self, n):
if self.value < n:
if self.right:
self.right.insert(n)
else:
self.right = node(n)
else:
if self.left:
self.left.insert(n)
else:
self.left = node(n)

s = [21,545,65,33,1,2324,232,42]
p = node(s[0])
for i in s[1:]:
p.insert(i)
print p.walk()

运行结果

python bi-tree.py
[1, 21, 33, 42, 65, 232, 545, 2324]

结论:一次编写,基本正确。python很合我的路子啊。

BTW 用<pre>贴python code很正点:)

About this Archive

This page is an archive of recent entries in the Python category.

Find recent content on the main index or look in the archives to find all content.