2017-02-03 3 views
0

Ich habe eine Liste von Tupeln:Merge die ersten Elemente in einer Liste ein Tupel, wenn die zweiten Elemente identisch sind?

[('Donald', 'PERSON'), ('Trump', 'PERSON'), ('enters', 'O'), ('the', 'O'), ('White', 'LOCATION'), ('House', 'LOCATION')] 

und der Ausgang I will:

[('Donald Trump'), ('enters the'), ('White House')] 

Der Code unten bringt mich zu dem gewünschten Ergebnis näher, aber ich bin nicht wirklich vertraut mit der Groupby-Funktion noch nicht.

mergedTags = [] 
    from itertools import groupby 
    for tag, chunk in groupby(tagList, lambda x: x[1]): 
     if tag != "O": 
      tagMerged = " ".join(w for w, t in chunk) 
      mergedTags.extend([tagMerged]) 
     else: 
      #tagMerged = " ".join(t for t, w in chunk) 
      for word, chunk in groupby(tagList, lambda x: x[0]): 
       mergedTags.extend([word]) 

    print(mergedTags) 
+0

Warum haben Sie eine Bedingung basierend auf ' 'O''? –

+0

Der Stanford Entity Recognizer markiert Elemente, die nicht als 'O' erkannt werden. – Yanic

Antwort

1

können Sie verwenden itertools.groupby mit Liste Verständnis Ausdruck als:

from itertools import groupby 
my_list = [('Donald', 'PERSON'), ('Trump', 'PERSON'), ('enters', 'O'), ('the', 'O'), ('White', 'LOCATION'), ('House', 'LOCATION')] 

output_list = [tuple(i[0] for i in e) for _, e in groupby(my_list, lambda x: x[1])] 
#    ^generate the desired tuple 

, wo der Wert halten, durch output_list sein:

[('Donald', 'Trump'), ('enters', 'the'), ('White', 'House')] 
+0

Hinweis: Tupel werden nur zusammengefügt, wenn sie zusammen sind. 'groupby' gruppiert die aufeinanderfolgenden Elemente. Wenn es eine Möglichkeit gibt, dass sie verteilt werden; Sie müssen zuerst die Eingabeliste basierend auf dem Index eins sortieren, d. h. "sortiert (my_list, key = lambda x: x [1])" –

Verwandte Themen