Frage / break-statemant

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
HPL
User
Beiträge: 10
Registriert: Mittwoch 1. Dezember 2010, 14:29

Code:

Code: Alles auswählen

                i=0
                for k in range(0, (len(res)-15)):
                        for x in res[k:k+14]:
                                if res[k+7][1]==x[1]:
                                         i+=1
                                         break
Erläuterung:
Ich habe diese Liste, die ich der Variable res zuweise (in Wirklichkeit ist die Liste wesentl. länger).
  • [('what', 'WP'), ('you', 'PP'), ('deserve', 'VVD'), ('the', 'DT'), ('skull', 'NN'), ('turn', 'VVD'), ('my', 'PP$'), ('stomach', 'NN'), ('but', 'CC'), ('the', 'DT'), ('other', 'JJ'), ('be', 'VBD'), ('bad', 'JJR'), ('those', 'DT'), ('ankle', 'NNS'), ('cut', 'VVD'), ('neatly', 'RB'), ('off', 'RB'), ('to', 'TO'), ('fit', 'VV'), ('Matt', 'NP'), ('Fenner', 'NP'), ("'s", 'POS'), ('castaside', 'NN'), ('coffin', 'NN')]
Ich will mir in dieser Liste jedes einhzelne "Fenster" der Länge 15 anschauen. Die Liste besteht aus Tupeln von (englischen) Wörtern und ihren "Tag"s. Immer wenn ein einziges Element innerhalb der Liste, nämlich immer dasjenige, das genau in der Mitte des Fensters steht ("Fokuselement"), irgendwo im Fenster mindestens ein Element hat, das denselben Tag besitzt, will ich die Variable int i um eins inkremetieren. Dabei ist es wichtig, dass innerhalb des jeweilgen Fensters (ich schaue mir ja jedes Fenster an) i auch dann nur um 1 inkrementiert wird, wenn der Tag, den das Fokuselement besitzt, mehr als einmal in dem Fenster vorkommt. break springt aus einer while- oder einer for-Schleiofe heraus, also müsste das OK so sein.

Frage:
Liege ich richtig oder muss ich das anders machen?
BlackJack

@HPL: Hast Du es denn mal ausprobiert? Dann hätte Dir auffallen müssen, dass da grundsätzlich ``max(0, len(res) - 15)`` bei heraus kommt. Denn *so* findest Du in *jedem* Fenster ein Wort mit dem Tag des Wortes in der Mitte — nämlich das Wort in der Mitte selbst.

Edit:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from itertools import imap
from operator import itemgetter


def iter_windows(sequence, window_length):
    for i in xrange(0, len(sequence) - window_length + 1):
        yield sequence[i:i + window_length]


def check(sequence):
    """Tests if the item in the middle of the given sequence occurs more
    than once in the sequence.
    """
    return sequence.count(sequence[len(sequence) // 2]) > 1


def main():
    res = [
        ('what', 'WP'), ('you', 'PP'), ('deserve', 'VVD'), ('the', 'DT'),
        ('skull', 'NN'), ('turn', 'VVD'), ('my', 'PP$'), ('stomach', 'NN'),
        ('but', 'CC'), ('the', 'DT'), ('other', 'JJ'), ('be', 'VBD'),
        ('bad', 'JJR'), ('those', 'DT'), ('ankle', 'NNS'), ('cut', 'VVD'),
        ('neatly', 'RB'), ('off', 'RB'), ('to', 'TO'), ('fit', 'VV'),
        ('Matt', 'NP'), ('Fenner', 'NP'), ("'s", 'POS'), ('castaside', 'NN'),
        ('coffin', 'NN'),
    ]
    
    window_length = 15
    tags = map(itemgetter(1), res)
    i = sum(imap(check, iter_windows(tags , window_length)))
    print i


if __name__ == '__main__':
    main()
HPL
User
Beiträge: 10
Registriert: Mittwoch 1. Dezember 2010, 14:29

@Blackjack: Zunächst vielen Dank!! Ich habe die itertools- und die operator-Bibliothek noch nie benutzt.
Ich hatte meine schlechte Version mit der ursprünglichen res-Liste ausprobiert, da kam ein Wert von 99% heraus, aber eben nicht 100%.
Dann hätte Dir auffallen müssen, dass da grundsätzlich ``max(0, len(res) - 15)`` bei heraus kommt. Denn *so* findest Du in *jedem* Fenster ein Wort mit dem Tag des Wortes in der Mitte — nämlich das Wort in der Mitte selbst.
Stimmt. Tut mir leid, aber mein Ansatz war eh schlecht...
Antworten