我对Python不熟悉。但是,我想从字符串的行中删除重复项。
前:
str = "aaa
aaa
aaa
abb
abb
ccc"
列表是已排序的有序列表。
str = "aaa
abb
ccc"
我有数百万条这样的台词。我知道删除重复项的漫长道路,但想知道是否有任何可能的简短形式。
答案 0 :(得分:3)
str
用作变量名,因为它是内置类型'''...'''
包装多行字符串sorted
,set
,split
,e.g:
In [895]: print '\n'.join(sorted(set(ss.split())))
aaa
abb
ccc
感谢@ user2357112提及,如果你想保留单词apear的顺序,请使用OrderedDict
:
In [910]: ss = '''zzz #<----------
...: aaa
...: aaa
...: aaa
...: abb
...: abb
...: ccc'''
In [911]: from collections import OrderedDict
...: print '\n'.join(OrderedDict.fromkeys(ss.split()))
zzz #here zzz ranks the first
aaa
abb
ccc
答案 1 :(得分:1)
如果列表已排序,则您不需要一个集合,因为所有重复项都将组合在一起。只需跟踪最后一个元素
prevLine = NIL
for line in lines
if line != prevLine:
# output line
prevLine = line
(我的python生锈了,不相信这里的语法。我会检查它)
答案 2 :(得分:1)
尝试设置:
init_str = """aaa
aaa
aaa
abb
abb
ccc"""
final_string=""
for x in set(init_str.split()):
final_string+=x+'\n'
print final_string
答案 3 :(得分:1)
"\n".join(set(s.split('\n')))
但是,你的字符串不是一个有效的python字符串,所以你可能想要这样做:
s = """aaa
aaa
aaa
abb
abb
ccc"""
但是你可能想要摆脱尾随空格:
"\n".join(set([s.strip() for s in s.split('\n')]))
N.B。:@ zhangxaochen建议,使用python保留字作为变量名确实是个坏主意。请改用s
之类的内容。
N.B.2:使用sorted和set是有意义的,因为看起来你正在处理前一个question
中的相同数据集答案 4 :(得分:1)
由于您的数据已经排序,我们可以利用现有订单来优化基于set
或OrderedDict
的解决方案的效果。使用itertools.groupby
:
import itertools
lines = [key for key, group in itertools.groupby(s.split())]
这可以避免不必要地构建大量的行。如果数据来自文件,那么小的适应性将超过所有基于set或OrderedDict的解决方案的内存消耗数量级:
with open('lines.txt') as f:
for line, group in itertools.groupby(f):
print line,
答案 5 :(得分:1)
我知道您正在处理已排序的输入,但如果事件输入未排序且您需要保留输入顺序,则可以使用OrderedDict
from collections import OrderDict
s = r'''aaa
aaa
aaa
abb
abb
ccc'''
for line in OrderedDict.fromkeys(s.splitlines()):
print line
aaa
abb
ccc