2017-11-22 16 views
1

これは私の最初の投稿/質問はここにstackoverflowです!文字列をPythonのタプル値で置き換える

(タプル内のリストに含まれている)絵文字を置き換えるときに問題が発生します。ここでは、コードは次のようになります。

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

を。誰かがここでリストの理解に何が間違っているかを見つけるのを助けることができますか?または、emojisを文字列に変換する別の方法を提案してください。 ありがとうございました!

答えて

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

関連する問題