python字符串去重的方法_二十、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中没有这个问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值