2017-05-22 9 views
0

タスク割り当て言葉固有の番号識別子

は、私は、文字列内の単語の番号識別子を割り当てるしようとしています。私は現在、次のことを行っている

コード

mystr = 'who are you you are who' 

str_values = mystr.split() 
list_values = [str(i) for i, w in enumerate(mystr.split())] 

出力:

>>> str_values 
['0', '1', '2', '3', '4', '5'] 
>>> list_values 
['who', 'are', 'you', 'you', 'are', 'who'] 

クエリ/所望の出力

mystrには繰り返しの単語が含まれているので、毎回異なる単語ではなく数字を割り当てたいと思いますが、どのようにして始めたらよいかわかりません。まあ、我々は2段階に分けて作業することができます

['0', '1', '2', '2', '1', '0'] 

答えて

3

あなたは、別のリストの助けを借りてこれを行うことができます -

n = [] 
output = [n.index(i) for i in mystr.split() if i in n or not n.append(i)] 

まずnは空のリストです。今、リスト理解はmystr.split()のすべての要素について繰り返されます。条件が満たされた場合、リストnの要素のインデックスを追加します。

今の状態です。 orの2つの部分があります。まず、要素がnに存在するかどうかをチェックします。はいの場合は、要素のインデックスを取得します。いいえの場合は、2番目の部分に移動し、要素をリストnに追加するだけです。今append()Noneを返します。それで私はそれを前に付け加えたのです。したがって、その条件が満たされ、新たに挿入された要素のインデックスが与えられます。

基本的にif条件の最初の部分はnに重複要素の追加を制限し、2番目の部分は追加を行います。

+0

驚くばかり!ありがとうございます、説明はもっと良くなります=) – LearningToPython

+0

@LearningToPython、説明を追加 – kuro

+0

パーフェクト!ありがとうございます=) – LearningToPython

1

  • は最初私たちはインデックスに単語をマッピングした辞書を構築し、そうではない与えられたので、私はのラインに沿って出力何かにlist_valuesを希望します存在しており、
  • 次に、単語識別子を得るために辞書を使用します。

同様:

identifiers = {} 
idx = 0 
for word in mystr.split(): 
    if word not in identifiers: 
     identifiers[word] = idx 
     idx += 1 

list_values = [identifiers[word] for word in mystr.split()] 

この生成:

>>> [identifiers[word] for word in mystr.split()] 
[0, 1, 2, 2, 1, 0] 

必要であれば、あなたもstr(..)で、文字列に識別子を変換することができますが、WOUはどうしたら私はなぜ表示されませんその:

>>> [str(identifiers[word]) for word in mystr.split()] 
['0', '1', '2', '2', '1', '0'] 

アルゴリズムwil私は通常O(n)で働いています。

1

あなたは言葉がすでに見られているのを追跡するために辞書を使用する必要が

word_map = {} 
word_id_counter = 0 
def word_id(word): 
    global word_id_counter 
    if word in word_map: 
     return word_map[word] 
    else: 
     word_map[word] = word_id_counter 
     word_id_counter += 1 
     return word_map[word] 

あなたはクラス

class WordIdGenerator: 
    word_map = {} 
    word_id_counter = 0 
    def word_id(self, word): 
     if word in self.word_map: 
      return self.word_map[word] 
     else: 
      self.word_map[word] = self.word_id_counter 
      self.word_id_counter += 1 
      return self.word_map[word] 

でそれをラップすることができますし、使用できるグローバル変数を使用して回避するために、それこのような:

gen = WordIdGenerator() 

[gen.word_id(w) for w in 'who are you you are who'.split()] 

、出力は次のようになります。

[0, 1, 2, 2, 1, 0] 
関連する問題