[英]Python removing specific duplicates from a list
我想从列表中删除特定的重复项。 使用Perl,我会用这段代码完成任务:
my @list = ( 'a1', 'a1', 'b1', 'b1' );
my %seen;
@list = grep( !/a\d/ || !$seen{ $_ }++, @list );
想要的结果是这样的:
@list = ( 'a1', 'b1', 'b1' );
我怎么能在Python 3中使用正则表达式和列表理解来做到这一点。 谢谢。
您可以使用itertools.chain
和groupby
:
>>> list(chain(*[[i[0]] if 'a1' in i else i for i in [list(g) for _,g in groupby(sorted(l))]]))
['a1', 'b1', 'b1']
如果你只想使用regex
你可以连接使用re.sub
的元素,但请注意它适用于这种特殊情况! 即,
是分隔符! :
>>> l =['a1', 'a1', 'b1', 'b1']
>>> re.sub(r'(a1,)+','a1,',','.join(sorted(l))).split(',')
['a1', 'b1', 'b1']
import re
from functools import reduce # this import is not needed in python 2.*
l = ['a1', 'a1', 'b1', 'b1']
print reduce(lambda acc, el: acc if re.match(r'a\d', el) and el in acc else acc + [el], l, [])
对不起,这是没有列表推导的解决方案。 这是严格要求的吗?
这是另一个解决方案,使用list(set(stuff))
从stuff
生成一个独特的东西list
(因为set
s自动重复删除东西):
In [1]: import re
In [2]: l = ["a1", "a1", "b1", "b1"]
In [3]: items_to_dedupe = [x for x in l if re.match(r"a\d", x)]
In [4]: leave_alone = [x for x in l if x not in items_to_dedupe]
In [5]: list(set(items_to_dedupe)) + leave_alone
Out[5]: ['a1', 'b1', 'b1']
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.