2017-11-22 7 views
1

이것은 내 첫 번째 게시물/질문 stackoverflow 여기에있다!문자열을 파이썬 튜플 값으로 바꾸기

튜플의 목록에 포함 된 이모티콘을 바꿀 때 문제가 있습니다. 여기 코드는 다음과 같습니다

첫 번째 시도는 예상 출력 생산
emoticons = [('SMILE',[':-)', ':)', '(:', '(-:']), 
     ('LAUGH',[':-D', ':D', 'X-D', 'XD', 'xD']), 
     ('LOVE', ['<3', ':\*']), 
     ('WINK', [';-)', ';)', ';-D', ';D', '(;', '(-;']), 
     ('FROWN', [':-(', ':(', '(:', '(-:']), 
     ('CRY', [':,(', ':\'(', ':"(', ':(('])] 


def token_to_emot(token): 
    for (emoji, smileys) in emoticons: 
     if token in smileys: 
      converted = token.replace(token, emoji) 
      return converted 
     else: 
      return token 

sample_tweet = ['It', 'was', 'amazing', ':)'] 
processed_tweet = [token_to_emot(token) for token in sample_tweet] 
print(processed_tweet) 

: 나는 나머지 튜플에서 스마일로 테스트하는 경우

['It', 'was', 'amazing', 'SMILE'] 

그러나, 코드가 작동하지 않고 그림 이모티콘은 변환되지 않습니다 . 누군가가 여기에있는 목록 이해력에있어 잘못된 점을 찾도록 도와 줄 수 있습니까? 또는 이모티콘을 문자열로 변환하는 또 다른 방법을 제안 하시겠습니까? 감사합니다.

답변

0

이모티콘의 존재 여부와 관계없이 루프의 첫 번째 반복으로 돌아옵니다. 대신 , 먼저 전체 emoticons 목록을 통해 반복을 완료해야하며, 대체가 발견되지 않은 경우에만 변환되지 않은 토큰을 반환 :

def token_to_emot(token): 
    for (emoji, smileys) in emoticons: 
     if token in smileys: 
      converted = token.replace(token, emoji) 
      return converted 

    # Note this is AFTER the for loop is exhausted.  
    return token 
+0

그것은했다! 감사. 내가 목록의 이해력을 약간 닦을 필요가있는 것처럼 보인다! – bart

+0

@bart 코드의 목록 이해 부분은 괜찮습니다. 'token_to_emot' 함수는 버그가 있습니다. – Mureinik

0

문제는 "다른"문에있다

def token_to_emot(token): 
    for (emoji, smileys) in emoticons: 
     if token in smileys: 
      converted = token.replace(token, emoji) 
      return converted 
     else: 
      return token 

당신은 토큰의 경우 반환 스마일은 첫 번째 스마일 배열에서 발견되지 않습니다.

을 위해 수정 - 또한

def token_to_emot(token): 
    for (emoji, smileys) in emoticons: 
     if token in smileys: 
      converted = token.replace(token, emoji) 
      return converted 
    else: 
     return token 
     # return token only and only if token!=smileys for all emoticons 

, 당신은 또한 사용할 수 있습니다 - 그것은 실질적으로 빠른 실행으로

sample_tweet = ['It', 'was', 'amazing', ':)'] 
processed_tweet = list(map(token_to_emot, sample_tweet)) 
+0

고마워! 이것은 잘 작동합니다! 나는 다른 해결책을 시도했지만 그것을 찾을 수없는 백 스페이스였습니다.] – bart

+0

하하, 당신은 for-else 루프에 대해서 더 알고 있습니다. –

0

나는, 이것에 대한 dictionary를 사용하는 것, 특히 더 당신이 처리하는 짹짹. 또한 읽기 쉽고 읽기 쉬운 목록 이해를 통해 코드를 크게 줄일 수 있습니다.

속도에 대한 참고 사항 :

  1. 현재 프로그램은 문자열 (O(n)) 내부의 모든 토큰에 대한 모든 이모티콘 (O(n))를 반복한다. 알고리즘을 만들기 O(n^2). 당신의 기술적 인면은 기술적으로 더 많습니다. O(ne) 여기서 n은 토큰의 수이고 e는 고유 한 이모티콘의 수입니다. 그래서, 그것은 문자 적으로 O (n^2)가 아닙니다. 하지만 효율성 차이를 설명하기 위해 이것을 사용하고있었습니다.

  2. 그러나 코드에서 토큰 당 사전 검사 (O(1))를 만들어야합니다. 이것은 나의 것입니다 O(n), 질량에 의해 트윗을 처리 할 때 상당한 차이가 있습니다.

코드

emoticons = [('SMILE',[':-)', ':)', '(:', '(-:']), 
     ('LAUGH',[':-D', ':D', 'X-D', 'XD', 'xD']), 
     ('LOVE', ['<3', ':\*']), 
     ('WINK', [';-)', ';)', ';-D', ';D', '(;', '(-;']), 
     ('FROWN', [':-(', ':(', '(:', '(-:']), 
     ('CRY', [':,(', ':\'(', ':"(', ':(('])] 

emoticonDi = {e:string for string,emoji in emoticons for e in emoji} 

import re 
def convert_emoji(string): 
    sample_tweet = string.split(" ") 
    processed_tweet = [emoticonDi[v] if v in emoticonDi else v for v in sample_tweet] 
    return processed_tweet 

print(convert_emoji('It was amazing :)')) 
+0

코드와 설명을 보내 주셔서 감사합니다!원래 코드가 개선 될 수 있는지에 대한 의견은 제가 찾고 있던 것입니다! – bart