2014-02-23 170 views
2

我對Python並不熟悉。但是,我想從字符串的行中刪除重複項。刪除字符串中的重複行

例:

str = "aaa 
     aaa 
     aaa 
     abb 
     abb 
     ccc" 

列表是一個排序的有序列表。

str = "aaa 
     abb 
     ccc" 

我已經有數百萬這樣的行。我知道消除重複的很長途徑,但想知道是否有可能的簡寫形式。

+1

你聽說過'set'和'split'嗎? – squiguy

回答

3
  1. 不要使用str作爲變量名,因爲它是一個內置式
  2. 使用'''...'''包多行字符串
  3. 使用sortedset,你的情況split

如:

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 
+0

或者如果順序很重要,''\ n'.join(OrderedDict.fromkeys(ss.split()))'。 – user2357112

+0

@ user2357112 thx,編輯 – zhangxaochen

1

如果列表已排序,則不需要設置,因爲所有重複項都將組合在一起。就在跟蹤的最後一個元素

prevLine = NIL 
for line in lines 
    if line != prevLine: 
    # output line 
    prevLine = line 

(我的Python是生鏽的,這裏不信任的語法。我會檢查它)

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 
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')])) 

注意:正如@zhangxaochen所說,使用python保留字作爲變量名的確是個不錯的主意。改爲使用s之類的東西。

NB2:使用排序,並設置有意義的,因爲它看起來像你正在處理來自同一數據集你以前question

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, 
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