String vergleichen

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
Mafiose

Freitag 21. Januar 2005, 17:13

Hallo,

gibt es python eine möglichkeit stings zu vergleichen?
ohne hin und her zu springen. d.h. einlesen, auslesen, usw..
man hat 3 verschiedene Strings, mit verschiedenen größen z.B
1. String enthält Werte: A30; C50; E80
2. String enthält WErte: G35;F75; D95
3. String enthält Werte: H15; I55; J105
und ich möchte jetzt wissen welche der 9 Werte von einander um <6 unterscheiden.
in dem Fall sollte rauskommen: A30;G35;C50;I55;E80;F75;D95
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Freitag 21. Januar 2005, 17:27

Hi Mafiose,

also im Prinzip kann man Strings natürlich auch in Python vergleichen, aber was hat das mit deiner Problemstellung zu tun? Deine Strings enthalten auch Zahlen, und wenn ich dich richtig verstehe, willst Du die Strings mit Zahlen rausfiltern, deren Zahlenwerte sich um < 6 unterscheiden. Dazu musst du natürlich erst die Zahlen rauspfriemeln und kannst dann die voneinander abziehen und den Absolutwert bestimmen, ist der dann < 6 nimmst die Werte sonst verwirfst du sie.
Was sucht in deinem Ergebnis die "D95"?


Gruß

Dookie
[code]#!/usr/bin/env python
import this[/code]
Mafiose

Montag 24. Januar 2005, 13:50

..na ich meine ich hab eine Datei *.txt
dort habe ich stehen z.B.

Hund: A30; C50; E80
Katze: G35;F75; D95
Maus: H15; I55; J105

und ich möchte jetzt wissen welche Werte weniger als 6 von einander unterscheiden.
dann müsste halt rauskommen: Hund: A30; Katze:G35 Maus: i55
...
D95...falsch gerechnet :)
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Montag 24. Januar 2005, 15:22

Gut, dann mal in die Hände gespuckt:

Code: Alles auswählen

#!/usr/bin/env python
# -*- encoding: latin-1 -*- 

packfile = 'six.txt'
maxdiff = 5

def readvalues():
    """Öffnet eine Datei und liest die Daten aus"""
    # Datei auf!
    f = file(packfile, 'r')
    # Zeilen auslesen, gleich ohne Zeilenenden
    lines = [l.splitlines()[0].split(None, 1)[1] for l in f.readlines()]
    # Datei zu!
    f.close()
    # so, jetzt alle Werte in eine Liste konvertieren
    values = reduce(lambda entry, entry2: entry + ' ; ' + entry2, lines).split(';')
    # und die einzelnen Einträge von Whitespaces befreien
    values = [val.split()[0] for val in values]
    # fertig hier
    return values

def sixpackparser():
    """Ermittelt die Werte die kleiner sind als die maximale Differenz"""
    # werte abholen
    numbers = readvalues()
    # Buchstaben wegkürzen
    purenumbers = [int(number[1:]) for number in numbers]
    # Der größe nach sortieren
    purenumbers.sort()
    
    # For Werte vorbereiten
    smallerdiff = []
    lastnum = 0
    for number in purenumbers:
        # wenn die Zahl kleiner ist als die maximale differenz zur vorheringen
        if (number - lastnum) <= maxdiff:
            # beide hinzufügen
            smallerdiff.append(lastnum)
            smallerdiff.append(number)
        # auf zur nächsten Zahl
        lastnum = number
    
    # wir versuchen zu den Nummern wieder ihre Buchstaben zu finden
    realout = []
    for number in smallerdiff:
        # gehen wir mal durch
        for charnum in numbers:
            # auch durch die Nummern mit Buchstaben
            if int(charnum[1:]) == number:
                # ja, die Nummer hinter dem Buchstaben stimmt überein
                #+mit der ohne Buchstaben
                realout.append(charnum)
    
    # okay fertig
    return realout

def main():
    """Die Hauptfunktion"""
    print sixpackparser()

if __name__ == '__main__':
    main()
Puh, das war ein ganz schöner Brocken Arbeit. Also, für die Daten die du gepostet hast, geht die jetzt gut. Etwas Feintuning könnte aber für andere Daten trotzdem noch nötig sein.

six.txt:

Code: Alles auswählen

Hund: A30; C50; E80
Katze: G35;F75; D95
Maus: H15; I55; J105
Ausgabe:

Code: Alles auswählen

['A30', 'G35', 'C50', 'I55', 'F75', 'E80']
Zuletzt geändert von Leonidas am Montag 24. Januar 2005, 16:12, insgesamt 1-mal geändert.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Gast

Montag 24. Januar 2005, 15:37

Mafiose hat geschrieben: Hund: A30; C50; E80
Katze: G35;F75; D95
Maus: H15; I55; J105

dann müsste halt rauskommen: Hund: A30; Katze:G35 Maus: i55
...
D95...falsch gerechnet :)
Ganz verstanden hab ich wohl nicht. Willst Du sowas?

Code: Alles auswählen

dateiinhalt = """Hund: A30; C50; E80
Katze: G35;F75; D95
Maus: H15; I55; J105"""

liste = []
for tier in dateiinhalt.split("\n"):
    tiername,werte = tier.split(':')
    for wert in werte.split(';'):
        zahl = int(wert.strip(" ABCDEFGHIJKLMNOPQRSTUVWXYZ"))
        liste.append((zahl,tiername+":"+wert))
    liste.sort()

for i,w in enumerate(liste):
    print w[1],
    try:
        if abs(liste[i][0] - liste[i+1][0]) >= 6:
            print ""
    except IndexError:
        pass
Ausgabe:
Maus: H15
Hund: A30 Katze: G35
Hund: C50 Maus: I55
Katze:F75 Hund: E80
Katze: D95
Maus: J105

Heinz
Mafiose

Montag 24. Januar 2005, 16:11

dankeschön für die schnelle Antworten...
ich werd das die Woche mal testen...die DAten waren ja nur Beispiele...hab etwas größeres Problem, viele verschiedene Daten...
wenn ich nicht weiterkomme meld ich mich ....
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Montag 24. Januar 2005, 17:07

Hi Mafiose,

um aus einer Zeile die Zahlen rauszuholen kannst Du z.B. eine Regularexpression verwenden.

Code: Alles auswählen

import re

text = "Hund: A30; C50; E80"
zahlen = re.findall("\d", text)
print zahlen
um echte Zahlen zu erhalten kann man eine LC verwenden.

Code: Alles auswählen

zahlen = [int(x) for x in re.findall("\d", text)]
Gruß

Dookie
[code]#!/usr/bin/env python
import this[/code]
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Montag 24. Januar 2005, 17:46

Sollte es nicht \d\d* sein, Dookie? Sonst bekommst du nur einzelne Zahlen..
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Montag 24. Januar 2005, 19:35

uups da fehlt ein +

Code: Alles auswählen

import re

text = "Hund: A30; C50; E80"
zahlen = [int(x) for x in re.findall("\d+", text)]
print zahlen 
so :D


Gruß

Dookie
[code]#!/usr/bin/env python
import this[/code]
Antworten