2013-05-15 1 views
1

파이썬에서는 문자열에서 중복 문자를 제거하고 싶지만 숫자 나 공백은 제거하지 않습니다. 내가 해낸 :알파 중복 만 제거

result = [] 
seen = set() 
for char in string: 
    if char not in seen: 
     seen.add(char) 
     result.append(char) 
return "".join(result) 

하지만 그 수 :

>>> delete_duplicate_letters("13 men were wounded in an explosion yesterday around 3:00pm.") 
13 menwroudiaxplsyt:0. 

내가 원할 때 :

>>> delete_duplicate_letters("13 men were wounded in an explosion yesterday around 3:00pm.") 
13 men wr oud i a xpls yt 3:00. 

내가 대신 charletterisalpha() 기능과 if int을 사용하려고했습니다 진술 등하지만 나는 아무것도 작동하지 못했습니다.

답변

1

이 시도 :

result = "" 
for char in string: 
    if not (char.isalpha() and char in result): 
     result += char 
+0

+1 멋진 멋진 솔루션을 원한다면, 문자열이 실제로 커지지 않거나 2 차 런타임이 시작될 것을 기대하십시오. – jamylak

1

사용을 str.isspacestr.isdigit :

strs = "13 men were wounded in an explosion yesterday around 3:00pm." 
result = [] 
seen = set() 
for char in strs: 
    if char not in seen: 
     if not (char.isspace() or char.isdigit()): 
      seen.add(char) 
     result.append(char) 
print "".join(result) 

출력 : 당신이 거의 다 같은

13 men wr oud i a xpls yt 3:00. 
0

이 보인다. 당신은 루프에 몇 가지 검사를 추가 할 수 있습니다

result = [] 
seen = set() 
for char in string: 
    if char.isdigit() or char.isspace(): 
     result.append(char) 
    elif char not in seen: 
     seen.add(char) 
     result.append(char) 
return "".join(result) 
여기
+0

+1 좋은 해결책이지만 '주위'가 완전히 제거 되었기 때문에 여분의 공간이 생깁니다. – jamylak

+1

@NiklasHansson See OP의 업데이트 : 여러 자리를 보존해야합니다. –

+0

내 잘못, 그는 그의 모범을 바꿨다. –

2
>>> from string import digits, whitespace 
>>> from collections import OrderedDict 
>>> s = set(whitespace + digits) 
>>> ''.join(OrderedDict((object() if c in s else c, c) for c in text).values()) 
'12 men wr oud i a xpls yt 3:00.' 

object()는 확인하는 데 사용됩니다 당신이 떠나고 싶지 문자 키가 object()가 다른 객체를 매번 생성 항상 독특한 때문이다. 다른 문자는 키 자체로 사용되므로 복제물이 필터링됩니다.

+0

이것은 bajillion up votes와 같은 가치가 있습니다. 모양이 너무 예뻐요 ... awesome – TerryA

+0

+1 멋지다. 전에는 'object()'에 대해 들어 본 적이 없다. –