Seite 1 von 1
String vergleichen
Verfasst: Freitag 21. Januar 2005, 17:13
von Mafiose
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
Verfasst: Freitag 21. Januar 2005, 17:27
von Dookie
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
Verfasst: Montag 24. Januar 2005, 13:50
von Mafiose
..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

Verfasst: Montag 24. Januar 2005, 15:22
von Leonidas
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:
Verfasst: Montag 24. Januar 2005, 15:37
von Gast
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
Verfasst: Montag 24. Januar 2005, 16:11
von Mafiose
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 ....
Verfasst: Montag 24. Januar 2005, 17:07
von Dookie
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.
Gruß
Dookie
Verfasst: Montag 24. Januar 2005, 17:46
von Leonidas
Sollte es nicht \d\d* sein, Dookie? Sonst bekommst du nur einzelne Zahlen..
Verfasst: Montag 24. Januar 2005, 19:35
von Dookie
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
Gruß
Dookie