1. 程式人生 > >二十、python 字串去重,主要依賴maketrans和translate這兩個方法

二十、python 字串去重,主要依賴maketrans和translate這兩個方法

最近遇到一個問題,怎麼來對一個字串去重?
我的思路是1.先分割字串;2.然後使用set去重;3.用join連線起來。
那就引入了另一個問題:怎麼分割字串來保證結果中不包含空格?當然有很笨的方法,本篇主要談論有沒有一種更簡單的方法?

首先,先來看一下需要分割的字串

# 張三;李四;王五;張三;李四
bbb = u';\u5f20\u4e09;\u674e\u56db;\u738b\u4e94;\u5f20\u4e09;\u674e\u56db;'

接下來,按照常規的方法,使用str.split()或re.split()分割並組合字串

print 'bbb: %s' % bbb
ccc = bbb.split
(';') print 'ccc: %s' % ccc print 'remove duplicate: %s' % set(ccc) print 'concat str: %s' % ';'.join(set(ccc))

輸出結果:

bbb: ;張三;李四;王五;張三;李四;
ccc: [u'', u'\u5f20\u4e09', u'\u674e\u56db', u'\u738b\u4e94', u'\u5f20\u4e09', u'\u674e\u56db', u'']
remove duplicate: set([u'', u'\u5f20\u4e09', u'\u674e\u56db', u'\u738b\u4e94'
]) concat str: ;張三;李四;王五

可以看到分割結果中包含空格,直接影響了最後的結果。如果想保證結果正確,一種方法是:在拆分前去掉bbb開頭和結尾的“;”;一種方法是去掉ccc中的空格元素。兩種方法都需要寫多餘的程式碼,不符合python,大道至簡的思想,^_^

下面看一下,比較簡便的解決方法

from string import maketrans

print 'bbb: %s' % bbb
table = maketrans(';', ' ')
ccc = bbb.encode('utf-8').translate(table)
ccc = ccc.decode('utf-8'
) print 'ccc: %s' % ccc print 'split ccc: %s' % ccc.split() l = set(ccc.split()) print 'remove duplicate: %s' % l print 'concat str: %s' % ';'.join(l)

輸出結果:

bbb: ;張三;李四;王五;張三;李四;
ccc:  張三 李四 王五 張三 李四 
split ccc: [u'\u5f20\u4e09', u'\u674e\u56db', u'\u738b\u4e94', u'\u5f20\u4e09', u'\u674e\u56db']
remove duplicate: set([u'\u5f20\u4e09', u'\u674e\u56db', u'\u738b\u4e94'])
concat str: 張三;李四;王五

需要注意的是,在python 2.X中,如果bbb為unicode執行 ccc = bbb.translate(table)會丟擲以下異常
TypeError: character mapping must return integer, None or unicode
需要轉碼為str才可以,在python3.x中沒有這個問題。