从字符串中删除重复的行

时间:2014-02-23 02:09:55

标签: python

我对Python不熟悉。但是,我想从字符串的行中删除重复项。

前:

str = "aaa
       aaa
       aaa
       abb
       abb
       ccc"

列表是已排序的有序列表。

str = "aaa
       abb
       ccc"

我有数百万条这样的台词。我知道删除重复项的漫长道路,但想知道是否有任何可能的简短形式。

6 个答案:

答案 0 :(得分:3)

  1. 不要将str用作变量名,因为它是内置类型
  2. 使用'''...'''包装多行字符串
  3. 在您的案例中使用sortedsetsplit
  4. 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)

由于您的数据已经排序,我们可以利用现有订单来优化基于setOrderedDict的解决方案的效果。使用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