我對Python並不熟悉。但是,我想從字符串的行中刪除重複項。刪除字符串中的重複行
例:
str = "aaa
aaa
aaa
abb
abb
ccc"
列表是一個排序的有序列表。
str = "aaa
abb
ccc"
我已經有數百萬這樣的行。我知道消除重複的很長途徑,但想知道是否有可能的簡寫形式。
我對Python並不熟悉。但是,我想從字符串的行中刪除重複項。刪除字符串中的重複行
例:
str = "aaa
aaa
aaa
abb
abb
ccc"
列表是一個排序的有序列表。
str = "aaa
abb
ccc"
我已經有數百萬這樣的行。我知道消除重複的很長途徑,但想知道是否有可能的簡寫形式。
str
作爲變量名,因爲它是一個內置式'''...'''
包多行字符串sorted
,set
,你的情況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
或者如果順序很重要,''\ n'.join(OrderedDict.fromkeys(ss.split()))'。 – user2357112
@ user2357112 thx,編輯 – zhangxaochen
如果列表已排序,則不需要設置,因爲所有重複項都將組合在一起。就在跟蹤的最後一個元素
prevLine = NIL
for line in lines
if line != prevLine:
# output line
prevLine = line
(我的Python是生鏽的,這裏不信任的語法。我會檢查它)
嘗試設置:
init_str = """aaa
aaa
aaa
abb
abb
ccc"""
final_string=""
for x in set(init_str.split()):
final_string+=x+'\n'
print final_string
好,基本上這是你想要的:
"\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
由於數據已經排序,我們可以採取現有秩序擊敗的優勢基於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,
我知道你正在處理排序輸入,但在事件輸入沒有排序,你需要輸入命令來保留,你可以使用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
你聽說過'set'和'split'嗎? – squiguy