2016-05-07 3 views
1

Ich habe etwas von einem schwierigen Problem erhalten Artikel in Tupeln. Ich habe eine Liste von Tupeln und es sieht wie folgt aus (ein Wort und einen Tag enthält):Iterieren durch Tupel, Erhalt des nächsten Elements

[('An', 'DET'), 
('autumn', 'NOUN'), 
('evening', 'NOUN'), 
('.', '.'), 
('In', 'ADP'), 
('an', 'DET'), 
('old', 'ADJ'), 
('woodshed', 'NOUN'), 
('The', 'DET'), 
('long', 'ADJ'), 
('points', 'NOUN'), 
('of', 'ADP'), 
('icicles', 'NOUN'), 
('Are', 'NOUN'), 
('sharpening', 'VERB'), 
('the', 'DET'), 
('wind', 'NOUN'), 
('.', '.')....] 

Was Ich mag würde, ist durch diese Tupel tun durchlaufen und die Wahrscheinlichkeit bestimmen, was das nächste Wort-Tag basiert auf dem vorherigen. Wenn ich z. B. bestimmen möchte, wie oft "DET" vor einem "NOUN" erscheint, würde ich die Tupel durchlaufen und zum Beispiel folgendes bestimmen:

"DET" erscheint vorne von 'NOUN'

Bisher habe ich das versucht:

prob = 0.0 
for item in tuples: 
    if item[1] == "DET" and item + 1[1] == "NOUN" 
return prob 

Die if Aussage offensichtlich nicht korrekt ist. Weiß jemand, was ich tun kann, um auf den nächsten Gegenstand zuzugreifen?

+0

Check out http://stackoverflow.com/questions/6822725/rolling-or-sliding-window-iterator-in-python Sie einen Schiebe verwenden können Fenster-Iterator, um Paare von Tupeln aus Ihrer Liste zu erhalten. –

Antwort

2

Der einfachste Weg, um die Worte zusammen paarweise zu bringen ist zip(seq, seq[1:]) zu verwenden, wie in den recipes section for the itertools module gezeigt.

Und der einfachste Weg, die Zählungen zu sammeln, ist collections.Counter() zu verwenden.

Putting sieht sie alle zusammen wie folgt aus:

>>> from collections import Counter 

>>> Counter((f, s) for (_, f), (_, s) in zip(tuples, tuples[1:])) 
Counter({('ADJ', 'NOUN'): 2, ('NOUN', 'ADP'): 2, ('NOUN', 'NOUN'): 2, 
     ('DET', 'NOUN'): 2, ('DET', 'ADJ'): 2, ('ADP', 'NOUN'): 1, 
     ('NOUN', 'VERB'): 1, ('NOUN', 'DET'): 1, ('VERB', 'DET'): 1, 
     ('ADP', 'DET'): 1}) 
+1

, der verdammt erstaunlich war. Vielen Dank – natalien

0

Verwendung enumerate(), um den Index des Elements zu erhalten Sie Schleifen:

count = 0 
for index, item in enumerate(tuples[:-1]): 
    if item[1] == 'DET' and tuples[index+1][1] == 'NOUN': 
     count += 1 

print count 
+0

Quick Followup: Wie kann ich einen Index außerhalb des Bereichs Fehler verhindern? – natalien

+1

@natalien Korrigiert. Ich habe es so gemacht, dass Sie durch die ganze Liste iterieren, bis auf den letzten Term – TerryA