Strings zu Deckung bringen

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
mit
User
Beiträge: 285
Registriert: Dienstag 16. September 2008, 10:00

Hallo,
die folgende Eingabedatei beinhaltet Strings, String ID (z.B. B7_591) und deren Start und Endpostion (z.B.ranage: 1-36 ) relativ zu einander:

Code: Alles auswählen

B7_591 ranage: 1-36
ibivbfvffivibvvfvbbbvfvfvffvvvbbivif
B7_592 ranage: 3-37 
ivbfvffivibvvfvbbbvfvfvffvvvbbivifv
A7_593 ranage: 5-39
bfvffivibvvfvbbbvfvfvffvvvbbivifvii
C8_591 ranage: 6-41
fvffivibvvfvbbvvvvvvfvvvvbbivivviviv
Q1_591 ranage: 9-43
fivibvvfvbbbvfvfvffvvvbbivifviibvff
Z1_591 ranage: 9-43
uiribvvfvbbbvfvfvffvvvbbivifviibvff
...
Bringt man die oberen Strings entsprechen der Startpostion zur Deckung so erhält folgendes:

Code: Alles auswählen

ibivbfvffivibvvfvbbbvfvfvffvvvbbivif 
  ivbfvffivibvvfvbbbvfvfvffvvvbbivifv
    bfvffivibvvfvbbbvfvfvffvvvbbivifvii 
     fvffivibvvfvbbvvvvvvfvvvvbbivivviviv 
        fivibvvfvbbbvfvfvffvvvbbivifviibvff 
        uiribvvfvbbbvfvfvffvvvbbivifviibvff
...
Wie könnte eine Datestruktur aussehen der man die gewünschte Position z.B.9 gebt und man erhält folgende Ausgabe:
f: B7_591
f: B7_592
f: A7_593
f: C8_591
f: Q1_591
u: Z1_591

Viele Dank im Voraus.

Viele Grüße
BlackJack

Vielleicht etwas in dieser Richtung!?

Code: Alles auswählen

from itertools import izip


class Thing(object):
    def __init__(self, name, value, offset):
        self.name = name
        self.value = value
        self.offset = offset
    
    def __str__(self):
        return '%s:%s%s' % (self.name, ' ' * self.offset, self.value)
    
    def __getitem__(self, index):
        if index < self.offset:
            raise IndexError('index %r too small (min: %r)'
                             % (index, self.offset))
        return self.value[index - self.offset]


def parse(lines):
    lines = iter(lines)
    for i, (name_line, value) in enumerate(izip(lines, lines)):
        name, dummy, range_ = name_line.split()
        value = value.rstrip()
        offset, end = map(int, range_.split('-'))
        if end - offset + 1 != len(value):
            raise ValueError('range error in line %d' % (i * 2))
        yield Thing(name, value, offset)


def get_item(things, index):
    for thing in things:
        try:
            yield (thing[index], thing.name)
        except IndexError:
            pass    # Intentionally ignored.


def main():
    with open('test.txt') as lines:
        things = list(parse(lines))
    
    for thing in things:
        print thing

    for item, name in get_item(things, 9):
        print '%s: %s' % (item, name)
Antworten