2012-03-23 92 views
23

Làm cách nào để xóa các ký tự trùng lặp khỏi chuỗi bằng Python? Ví dụ, giả sử tôi có một chuỗi:Xóa các ký tự trùng lặp khỏi chuỗi

foo = 'mppmt' 

Làm thế nào tôi có thể làm cho chuỗi:

foo = 'mpt' 

Chú ý: thứ tự là không quan trọng

+2

Ahem ... http://stackoverflow.com/questions/636977/best-way-to-remove-duplicate-characters-words-in-a-string – nullpotent

+1

@ AljoshaBre - sử dụng nút 'close' và chọn 'close as dupe' và cung cấp liên kết đó. Cảm ơn bạn –

+2

@AljoshaBre Không ai trong số những câu trả lời được đảm bảo để duy trì trật tự. – Marcin

Trả lời

49

Nếu tự không quan trọng, bạn có thể sử dụng

"".join(set(foo)) 

set() sẽ tạo ra một tập hợp các ký tự đặc biệt trong chuỗi, và "".join() sẽ tham gia các chữ cái trở lại một chuỗi theo thứ tự tùy ý.

Nếu trật tự không vấn đề, bạn có thể sử dụng collections.OrderedDict bằng Python 2.7:

from collections import OrderedDict 
foo = "mppmt" 
print "".join(OrderedDict.fromkeys(foo)) 

in

mpt 
+2

+1: 'fromkeys()' không được sử dụng thường xuyên, nhưng bạn đặt nó vào sử dụng tuyệt vời ở đây. – EOL

+0

+1 Sử dụng tuyệt vời của 'từ khóa()' –

1

Nếu trật tự không phải là vấn đề:

>>> foo='mppmt' 
>>> ''.join(set(foo)) 
'pmt' 

Để giữ đơn đặt hàng:

>>> foo='mppmt' 
>>> ''.join([j for i,j in enumerate(foo) if j not in foo[:i]]) 
'mpt' 
0

Nếu trật tự là rất quan trọng,

seen = set() 
result = [] 
for c in foo: 
    if c not in seen: 
     result.append(c) 
     seen.add(c) 
result = ''.join(result) 

Hoặc để làm điều đó mà không cần bộ:

result = [] 
for c in foo: 
    if c not in result: 
     result.append(c) 
result = ''.join(result) 
+1

@Marcin: Tôi không hiểu điều đó chút nào. Sẽ không luôn luôn được đặt trong (foo)? – DSM

+0

@Marcin Điều đó sẽ luôn trả về một chuỗi rỗng. Mọi c trong foo đều được thiết lập (foo) –

+1

@DSM/Kevin. Điều tốt tôi đã không đăng bài đó như là một câu trả lời. 'seen = set(); '' .join (see.add (c) hoặc c cho c trong foo nếu c không thấy) '. Đó là một ngày thứ sáu tiềm ẩn-rõ ràng hơn. – Marcin

26

Nếu trật tự không vấn đề, làm thế nào về:

>>> foo = 'mppmt' 
>>> ''.join(sorted(set(foo), key=foo.index)) 
'mpt' 
+6

gọn gàng và dễ đọc. Thật không may, đó là O (n^2). –

+2

Đủ rồi. Nhưng nó nhanh gấp 8 lần so với OrderedDict.fromkeys trên một chuỗi gồm 5 ký tự. ;-) DSM

+0

Bạn giành chiến thắng này. – Marcin

0

Như đã được đề cập "" .join (set (foo)) và collections.OrderedDic t sẽ làm. Một foo = foo.lower() được thêm vào trong trường hợp chuỗi có ký tự chữ hoa và chữ thường và bạn cần phải loại bỏ TẤT CẢ các bản sao bất kể chúng có ký tự trên hay dưới.

from collections import OrderedDict 
foo = "EugeneEhGhsnaWW" 
foo = foo.lower() 
print "".join(OrderedDict.fromkeys(foo)) 

in eugnhsaw

Các vấn đề liên quan