alle index eines gesuchten Chars in einem String

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
smith0815
User
Beiträge: 99
Registriert: Dienstag 13. April 2010, 11:08

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.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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.)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
smith0815
User
Beiträge: 99
Registriert: Dienstag 13. April 2010, 11:08

:( 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.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
smith0815
User
Beiträge: 99
Registriert: Dienstag 13. April 2010, 11:08

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.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
smith0815
User
Beiträge: 99
Registriert: Dienstag 13. April 2010, 11:08

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.
Zuletzt geändert von smith0815 am Freitag 17. Juni 2011, 20:37, insgesamt 1-mal geändert.
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

Hyperion hat geschrieben:Sortieren kostet übrigens immer O(n log n)
SleepSort ist O(n) :wink:
In specifications, Murphy's Law supersedes Ohm's.
smith0815
User
Beiträge: 99
Registriert: Dienstag 13. April 2010, 11:08

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
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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 :-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
smith0815
User
Beiträge: 99
Registriert: Dienstag 13. April 2010, 11:08

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
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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?
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

@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.
Zuletzt geändert von pillmuncher am Freitag 17. Juni 2011, 22:40, insgesamt 3-mal geändert.
In specifications, Murphy's Law supersedes Ohm's.
smith0815
User
Beiträge: 99
Registriert: Dienstag 13. April 2010, 11:08

@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.
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

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
In specifications, Murphy's Law supersedes Ohm's.
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

Folgendes habe ich auf stackoverflow gefunden, vielleicht hilft's Dir ja weiter...

mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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 ;-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
smith0815
User
Beiträge: 99
Registriert: Dienstag 13. April 2010, 11:08

OK
Danke
bords0
User
Beiträge: 234
Registriert: Mittwoch 4. Juli 2007, 20:40

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)
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()`.
Antworten