二十、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中沒有這個問題。

參考文檔:
http://blog.csdn.net/luke2834/article/details/54588231
http://www.jb51.net/article/66353.htm
http://blog.csdn.net/vickyrocker1/article/details/50952095
https://stackoverflow.com/questions/20849805/python-hmac-typeerror-character-mapping-must-return-integer-none-or-unicode

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章