2017-10-26 3 views
2

私は何時間も苦労していて、うまくいかないので、助けてください!私はいくつかのタプルを含むリストの2つのリストを持っています。Python:繰り返し実行して2つのタプルのリストを要素ごとに比較します

list_1 = [[('This', 'DT'), ('is', 'VBZ'), ('an', 'DT'), ('apple', 'NN')], [('This', 'DT'), ('Should', 'MD'), ('be', 'VB'), ('taught', 'VBN'), ('at','IN'), ('school', 'NN')], [('you', 'PRP'), ('might', 'MD'), ('take', 'VB'), ('them', 'PRP')]] 

list_2 = [[('This', 'DT'), ('is', 'VBN'), ('an', 'DT'), ('apple', 'NNS')], [('This', 'DT'), ('Should', 'VB'), ('be', 'VB'), ('taught', 'VBN'), ('at','IN'), ('school', 'NNP')], [('you', 'PRP'), ('might', 'MD'), ('take', 'VB'), ('them', 'PRP')]] 

私はlist_1list_2要素単位で各文の各タプルを比較し、異なるタグを持っている唯一のタプルを返すようにしたいです。

def get_similarity(): 
 
     for list_1_sentence, list_2_sentence in zip(list_1, list_2): 
 
      if len(list_1) != len(list_2): 
 
       try: 
 
        raise Exception('this is an exception, some tags are missing') 
 
       except Exception as error: 
 
        print('caught this error : ', repr(error)) 
 
      else: 
 
       return [(x, y) for x, y in zip(list_1_sentence, list_2_sentence) if x != y] 
 
       
 
get_similarity()

問題は、それが別のタプルを返しますが、唯一の最初の文のためということである。

[(('is', 'VBZ), ('is', 'VBN)), ('apple', 'NN'), ('apple', 'NNS'))] 

なぜすべての文章を反復処理しないのですか?

答えて

2

あなたはこれを試すことができます。

list_1 = [[('This', 'DT'), ('is', 'VBZ'), ('an', 'DT'), ('apple', 'NN')], [('This', 'DT'), ('Should', 'MD'), ('be', 'VB'), ('taught', 'VBN'), ('at','IN'), ('school', 'NN')], [('you', 'PRP'), ('might', 'MD'), ('take', 'VB'), ('them', 'PRP')]] 

list_2 = [[('This', 'DT'), ('is', 'VBN'), ('an', 'DT'), ('apple', 'NNS')], [('This', 'DT'), ('Should', 'VB'), ('be', 'VB'), ('taught', 'VBN'), ('at','IN'), ('school', 'NNP')], [('you', 'PRP'), ('might', 'MD'), ('take', 'VB'), ('them', 'PRP')]] 
final_tags = list(filter(lambda x:x, [[c for c, d in zip(a, b) if c[-1] != d[-1]] for a, b in zip(list_1, list_2)])) 

出力:

[[('is', 'VBZ'), ('apple', 'NN')], [('Should', 'MD'), ('school', 'NN')]] 
+0

ありがとう、面白いアプローチの原因は後で私は文とそのタグの間の類似率を検索したい。したがって、異なるタグを1回だけ返す方が便利です。 – joasa

+0

これは興味深いアプローチですが、恐らく最も読みにくい方法の1つです。ゴルフのように、+1:P – HyperNeutrino

2

ループの最初の繰り返しから戻ってきます。しかし、あなたは簡単に返すのではなく、降伏によって発電機にそれを回すことができます。

def get_similarity(): 
    for list_1_sentence, list_2_sentence in zip(list_1, list_2): 
     #... 
     yield [(x, y) for x, y in zip(list_1_sentence, list_2_sentence) if x != y] 

list(get_similarity()) 
3

returnは、ループを抜ける途中で

ループは最初の繰り返しにあなたがreturn値ので、一度実行されます。代わりに、すべての結果を追跡して、関数の最後に戻ります。

def get_similarity(): 
    results = [] 
    for list_1_sentence, list_2_sentence in zip(list_1, list_2): 
     # ... 
     results.append([(x, y) for x, y in zip(list_1_sentence, list_2_sentence) if x != y]) 
    return results 

これは動作するはずです。 Try it Online!

+0

おかげで多くのことを、それが働きました! – joasa

関連する問題