Seite 1 von 1

Frage / break-statemant

Verfasst: Samstag 30. Juli 2011, 09:10
von HPL
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?

Re: Frage / break-statemant

Verfasst: Samstag 30. Juli 2011, 09:39
von 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()

Re: Frage / break-statemant

Verfasst: Samstag 30. Juli 2011, 10:59
von HPL
@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...