Posts Tagged ‘Python’
30
Apr

现在简繁中文的转换已经不像从前那样,是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

, ,

20
Apr

编程果然不能偷懒!我这一偷懒,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

这是我要记住的一课。

,

14
Apr

二叉树是计算机算法中普遍采用的数据结构。在所有排序算法中具有高效率的二叉树排序就是基于此结构。我抽空用新学的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)

if __name__ == '__main__':
    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很正点:)

,

12
Mar

关于urls.py

假设test项目下有一个应用模块notes,那么:

test/urls.py:

from django.conf.urls.defaults import *

urlpatterns = patterns(‘ ‘,

(r’^notes/’, include(‘notes.urls’)),

)

这样所有匹配/notes/*的访问将转交给notes/urls.py处理。

test/notes/urls.py:

urlpatterns = patterns(‘ ‘,

url(r’^list/$’, views.list_notes, name=’note_list’),

url(r’^(?P<note_id>\d+)/$’, views.show_note, name=’note_show’),

)

首先,由于需要反向解析(页面名称->URL),所以要使用url(),而不是原来的tuple。对应url(r’^list/$’, views.list_notes, name=’note_list’), 将匹配/notes/list/的访问指向给views.py中的list_notes()方法,并将’note_list’名称反向解析到/notes/list/的URL,以便在webapp中生成链接。

第二行中的(?P<note_id>\d+)是一个参数定义,其中note_id是参数名,\d+说明此参数是一个数字。其实起到的作用就是将/note/123/这样的url解释成一个调用show_note(request, note_id=123)。如果参数不是数字而是字词,那么\d+应该改为\w+,具体定义可以参考regex规则。

,

09
Mar

你上考场那年带小抄了么?带了也别说,那是作弊。不过上班跟考试不同,你要尽可能的用上一切能方便工作的工具。下面是我最近喜欢的几张小抄:

以上小抄来自 http://www.addedbytes.com/cheat-sheets Thanks Dave!

, ,