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
String vergleichen
-
- Python-Forum Veteran
- Beiträge: 2010
- Registriert: Freitag 11. Oktober 2002, 18:00
- Wohnort: Salzburg
- Kontaktdaten:
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
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]
import this[/code]
..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
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
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Gut, dann mal in die Hände gespuckt:
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:
Ausgabe:
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()
six.txt:
Code: Alles auswählen
Hund: A30; C50; E80
Katze: G35;F75; D95
Maus: H15; I55; J105
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 (former) Modvoice
Ganz verstanden hab ich wohl nicht. Willst Du sowas?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
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
Maus: H15
Hund: A30 Katze: G35
Hund: C50 Maus: I55
Katze:F75 Hund: E80
Katze: D95
Maus: J105
Heinz
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 ....
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 ....
-
- Python-Forum Veteran
- Beiträge: 2010
- Registriert: Freitag 11. Oktober 2002, 18:00
- Wohnort: Salzburg
- Kontaktdaten:
Hi Mafiose,
um aus einer Zeile die Zahlen rauszuholen kannst Du z.B. eine Regularexpression verwenden.
um echte Zahlen zu erhalten kann man eine LC verwenden.
Gruß
Dookie
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
Code: Alles auswählen
zahlen = [int(x) for x in re.findall("\d", text)]
Dookie
[code]#!/usr/bin/env python
import this[/code]
import this[/code]
-
- Python-Forum Veteran
- Beiträge: 2010
- Registriert: Freitag 11. Oktober 2002, 18:00
- Wohnort: Salzburg
- Kontaktdaten:
uups da fehlt ein +
so
Gruß
Dookie
Code: Alles auswählen
import re
text = "Hund: A30; C50; E80"
zahlen = [int(x) for x in re.findall("\d+", text)]
print zahlen
Gruß
Dookie
[code]#!/usr/bin/env python
import this[/code]
import this[/code]