Seite 1 von 1

Strings zu Deckung bringen

Verfasst: Mittwoch 9. Juni 2010, 11:25
von mit
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

Re: Strings zu Deckung bringen

Verfasst: Mittwoch 9. Juni 2010, 11:59
von 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)