Seite 1 von 1

alle index eines gesuchten Chars in einem String

Verfasst: Freitag 17. Juni 2011, 19:09
von smith0815
Hi

wie der Titel schon verrät, suche ich einen Befehl mit dem ich eine Liste aller vorkommender Positionen eines gesuchten Zeichens in einem String
erhalte, denn mit str.index erhalte ich ja nur das erste vorkommen.

Re: alle index eines gesuchten Chars in einem String

Verfasst: Freitag 17. Juni 2011, 19:16
von Hyperion
Wie wäre es damit:

Code: Alles auswählen

In [5]: data = "Dies ist ein Satz mit vielen is"

In [6]: search = "i"

In [7]: [index for index, char in enumerate(data) if char==search]
Out[7]: [1, 5, 10, 19, 23, 29]
Musst den Ansatz halt noch in eine Funktion gießen :-)
(Dabei würde ich evtl. eine Generator-Funktion erstellen! Je nach Anwendungsfall kann das günstiger sein.)

Re: alle index eines gesuchten Chars in einem String

Verfasst: Freitag 17. Juni 2011, 19:23
von smith0815
:( Danke für die Hilfe.
Leider ist mein Problem, dass ich versuche genau solch eine for-Schleife zu ersetzten,
da zu langsam bei großen Datenmengen.

Daher meine Frage nach einem einfacheren Befehl.

Re: alle index eines gesuchten Chars in einem String

Verfasst: Freitag 17. Juni 2011, 19:26
von Hyperion
smith0815 hat geschrieben::( Danke für die Hilfe.
Leider ist mein Problem, dass ich versuche genau solch eine for-Schleife zu ersetzten,
da zu langsam bei großen Datenmengen.
Das ist ja keine Frage der Sprache oder des Sprachkonstruktes, sondern der Algorithmik. Und bei dem gegebenen Problem musst Du jedes Element der Eingabemenge nun einmal "anfassen". Die Komplexität ist also def. O(n) bei n = Länge des Strings. Da kannst Du Dich drehen und wenden wie Du willst ;-)

Vielleicht verrätst Du einfach, was Du damit eigentlich machen willst? Evtl. reicht ja ein Generatorausdruck, um das Problem zu lösen.

Re: alle index eines gesuchten Chars in einem String

Verfasst: Freitag 17. Juni 2011, 19:44
von smith0815
ich habe mehrere Spalten mit Daten, die leider zwar gleiche Daten, diese aber in unterschiedlicher Anordnung enthalten.

Mein Prog erhält dazu ein String aus mehreren Flags, welche die Zuordnung der Daten zur Bezeichnung enthält.
Anhand dieses Strings sollen nun die Daten umsortiert werden, so dass alle Datensätze die selbe Anordnung haben

Bsp.
Datensatz 1 Datensatz 2
ABBCFDE DEFBBAC

Programm:
Datensatz 1 Datensatz 2
ABBCDEF ABBCDEF

Wie man sieht hat B 2 Spalten, im realen sind es teilweise noch mehr Spalten pro Messung und die Datensätze sind auch länger.

Re: alle index eines gesuchten Chars in einem String

Verfasst: Freitag 17. Juni 2011, 19:57
von Hyperion
Sorry, aber anhand dieser Beschreibung habe ich das noch nicht kapiert! Wo sind die Flags? Wo die Datensätze? Wie funktioniert das Umsortieren genau? (Sortieren kostet übrigens immer O(n log n))

Du musst das mal ein wenig deutlicher darstellen.

Re: alle index eines gesuchten Chars in einem String

Verfasst: Freitag 17. Juni 2011, 20:36
von smith0815
OK
Die Datensätze bestehen aus Zahlen

Code: Alles auswählen

23 34 67 ...
35 34 35 ...
34 56 78 ...
.  .  .
.  .  .
.  .  .
Es sind ca. 500.000 Datensätze
Zu jedem Datensatz gibt es eine Liste aus Flags, welche die Anordnung der Messdaten beschreibt.
ABBCFDE

Bei den meisten Datensätzen ist die Anordnung leider unterschiedlich.

PS: Es kommt weil verschiedene Messzentren zwar das selbe gemessen haben, aber dies immer nach ihren
eigenen gut dünkten abgespeichert haben.

Mein Programm soll alle Datensätze in eine einheitliche Form bringen.

Re: alle index eines gesuchten Chars in einem String

Verfasst: Freitag 17. Juni 2011, 20:36
von pillmuncher
Hyperion hat geschrieben:Sortieren kostet übrigens immer O(n log n)
SleepSort ist O(n) :wink:

Re: alle index eines gesuchten Chars in einem String

Verfasst: Freitag 17. Juni 2011, 20:39
von smith0815
Leider entspricht die Anordnung der Flags nicht dem Alphabet
daher ist eine Sortierung nicht möglich

PS: oben war es nur ein Beispiel für die Flags

Re: alle index eines gesuchten Chars in einem String

Verfasst: Freitag 17. Juni 2011, 20:41
von Hyperion
pillmuncher hat geschrieben:
Hyperion hat geschrieben:Sortieren kostet übrigens immer O(n log n)
SleepSort ist O(n) :wink:
*g* Kannte ich noch nicht, danke! :-)

@smith0815: Sei mir nicht böse, aber ich kapiere immer noch nicht, wie die Flags mit den Zahlen zusammen hängen und nach welchem Kriterium nun sortiert werden soll! Zudem sehe ich keinen Zusammenhang zu Deiner ersten Frage.

Erkläre doch mal zuerst, wie die Datensätze (offensichtlich Integerwerte) mit den Flags zusammenhängen!

Dann erkläre, in welche Form sie gebracht werden sollen.

Danach dann, anhand welchen Kriteriums die Reihenfolge bestimmbar wird.

Ich denke danach haben wir das eigentliche Problem schon mal geklärt :-)

Re: alle index eines gesuchten Chars in einem String

Verfasst: Freitag 17. Juni 2011, 21:01
von smith0815
Bsp.
jeder Datensatz hat ca. 50 Spalten
jede Spalte hat ein Flag, welches die Spalte einem Messinstument zuordnet
dabei kann ein Messinstument mehre Spalten inne haben (das nur am Rand)

d.h. 50 Spalten = 50 Flags
in der Form:
AAAAAACCCBBBBBFFFFFFDDDDDDDDDDDDDDDEEEEEEEEEEEEEEE

Diese Spalten sollen anhand eines Vorgabe-Flags umsortiert werden.
(Nur in für dieses Beispiel)

AAAAAABBBBBCCCDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEFFFFFF

So dass jeder Datensatz diese 2. Form aufweist.
Daher brauche ich eine Funktion, welche mir die Indices für die einzelnen Messinstrumente raussucht, sodass ich sie umorganisieren kann

Re: alle index eines gesuchten Chars in einem String

Verfasst: Freitag 17. Juni 2011, 21:08
von Hyperion
Ok, langsam kommt Licht ins Dunkel!

Letzte Frage: Spielt die Reihenfolge innerhalb einer Messinstrumentengruppe im Zielflag eine Bedeutung? Also muss das im Originalflag beheimatete 5. Vorkommen von "C" auch in der Zieldatenstruktur das 5. Vorkommen eines Cs sein?

Re: alle index eines gesuchten Chars in einem String

Verfasst: Freitag 17. Juni 2011, 21:12
von pillmuncher
@smith0815: Wenn nur wichtig ist, dass alle Datensätze am Ende dieselbe Ordnung haben, egal welche, dann geht womöglich sowas:

Code: Alles auswählen

import csv
from operator import itemgetter

def ordered_records(filename, order_index):
    order_key = itemgetter(0)
    with open(filename, 'r') as records:
        for record in csv.reader(records, delimiter=' '):
            tmp = zip(record[order_index], record)  # Decorate
            tmp.sort(key=order_key)                 # Sort
            yield [field for _, field in tmp]       # Undecorate
...
for each in ordered_records('messungen.csv', 51):   # 0-50 Datenfelder + 1 Flag-String
    ...
Auch DSU-Pattern genannt.

Dabei werden alle Records in dieselbe Reihenfolge gebracht, wie der nach Buchstaben alphabetisch sortierte Flag-String. Wenn statt dessen alle Records in eine bestimmte, von der alphabetischen Ordnung abweichende, vorgegebene Ordnung gebracht werden müssen, wird's komplizierter.

Re: alle index eines gesuchten Chars in einem String

Verfasst: Freitag 17. Juni 2011, 21:16
von smith0815
@pillmuncher es ist komplizierter

Ja die Reihenfolge ist wichtig.
zwar sind die Werte so unterschiedlich, dass ich mit einer If-Abfrage erkennen kann welche Werte wohin gehören,
aber was ist wieder mehr Rechenzeit.

Re: alle index eines gesuchten Chars in einem String

Verfasst: Freitag 17. Juni 2011, 21:34
von pillmuncher
smith0815 hat geschrieben:@pillmuncher es ist komplizierter
Ja die Reihenfolge ist wichtig.
Dann so:

Code: Alles auswählen

from operator import itemgetter

lookup = {c:i for i, c in enumerate('DAHSRKLIM...')} # D < A < H < S < ...

def ordered_records(filename, order_index):
    order_key = itemgetter(0)
    with open(filename, 'r') as records:
        for record in csv.reader(records, delimiter=' '):
            keys = (lookup[c] for c in record[order_index])
            tmp = zip(keys, record)             # Decorate
            tmp.sort(key=order_key)             # Sort
            yield [field for _, field in tmp]   # Undecorate

Re: alle index eines gesuchten Chars in einem String

Verfasst: Freitag 17. Juni 2011, 21:49
von mutetella
Folgendes habe ich auf stackoverflow gefunden, vielleicht hilft's Dir ja weiter...

mutetella

Re: alle index eines gesuchten Chars in einem String

Verfasst: Freitag 17. Juni 2011, 21:54
von Hyperion
mutetella hat geschrieben:Folgendes habe ich auf stackoverflow gefunden, vielleicht hilft's Dir ja weiter...

mutetella
Vermutlich eher nicht - man sollte schon den ganzen Thread lesen ;-)

Re: alle index eines gesuchten Chars in einem String

Verfasst: Freitag 17. Juni 2011, 22:38
von smith0815
OK
Danke

Re: alle index eines gesuchten Chars in einem String

Verfasst: Sonntag 10. Juli 2011, 12:35
von bords0
Uralter Thread, aber das will ich nicht so stehen lassen...
pillmuncher hat geschrieben:

Code: Alles auswählen

from operator import itemgetter

lookup = {c:i for i, c in enumerate('DAHSRKLIM...')} # D < A < H < S < ...

def ordered_records(filename, order_index):
    order_key = itemgetter(0)
    with open(filename, 'r') as records:
        for record in csv.reader(records, delimiter=' '):
            keys = (lookup[c] for c in record[order_index])
            tmp = zip(keys, record)             # Decorate
            tmp.sort(key=order_key)             # Sort
            yield [field for _, field in tmp]   # Undecorate
...weil das key-Argument geradezu prädestiniert dafür ist, DSU zu vermeiden. Ungetestete Variante:

Code: Alles auswählen

lookup = {c:i for i, c in enumerate('DAHSRKLIM...')} # D < A < H < S < ...

def ordered_records(filename, order_index):
    def order_key(record):
        return lookup[record[order_index]]
    with open(filename, 'r') as records:
        for record in csv.reader(records, delimiter=' '):
            yield sorted(record, key=order_key)

Re: alle index eines gesuchten Chars in einem String

Verfasst: Sonntag 10. Juli 2011, 14:41
von BlackJack
Streng genommen vermeidet man damit DSU in Python selber zu implementieren und verwendet stattdessen die bei CPython in C implementierte DSU-Implementierung von `sorted()`.