binary Suche

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
Ramset
User
Beiträge: 6
Registriert: Sonntag 8. Januar 2023, 17:50

Hallo @ all!

Folgendes Problem, was mich schon länger Wurmt..

Beispiel:

Ich habe eine Liste, die eine lange Zeichenfolge im Binärcode enthält.
list = ['100111101100000010001000111101101101110011100110111111101110000011111111101100000010001000111101101101110011100110111111101110000011']
..........|__________1. Schlüssel__________________|
.................|__________2. Schlüssel__________________|
....................usw...
gesucht werden alle Möglichkeiten zB.: in 32-bit längnen, die sich aus dieser Liste ergeben und immer mit "1" starten.
Wie gebe ich den String vor, Start mit '1' und länge = 32?
Die "find" Funktion hilft hier nicht weiter..
y.find('1') !=......
print(y[:32]), damit wird mir nur die Erste in der Liste vorkommende Zeichenfolge ausgegeben..

Ich hoffe, ihr könnt mir helfen :)
Grüße!
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

Was kennt denn .find() noch so für Argumente?

Und warum wird in einem Beispiel eigentlich nicht der erste Schlüssel ab dem ersten Zeichen gefunden?
und warum der zweite nicht ab dem 4. Zeichen?

Alternativ kannst du dir selbst natürlich jedes Zeichen anschauen und bei Übereinstimmung den Substring bilden.
Ramset
User
Beiträge: 6
Registriert: Sonntag 8. Januar 2023, 17:50

es wird mit "find" nur der erste Schlüssel gefunden/ausgegeben... geau das ist das problem :(
die Argumente in find(value, start, end) bringen nichts...
jedes Zeichen anschauen wäre bei einer kleinen Liste sicher kein Problem, aber bei einer Länge von tausenden Zeichen, etwas aufwändig ^^
deshalb die Suche nach einer Lösung...
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

Was denkst du denn, was find macht? Nicht die tausenden Zeichen durchsuchen?
Und warum bringen denn die Argumente nichts? "start" drängt sich hier doch sehr auf.
Ramset
User
Beiträge: 6
Registriert: Sonntag 8. Januar 2023, 17:50

teste es selber...
list1 = "11001000110010001100110110010001100100011000110011000101100010001101111001000110010001100110110010001100100011000110011000"
y = "".join(list1)
for n in range(len(list1)):
y.find('1', n)
print(y[:32], len(list1))
Benutzeravatar
noisefloor
User
Beiträge: 4195
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

man kann collections.deque nutzen und ein "Fenster" mit 32 Zeichen Länge über den String laufen lassen:

Code: Alles auswählen

from collections import deque
data = ['100111101100000010001000111101101101110011100110111111101110000011111111101100000010001000111101101101110011100110111111101110000011']
d = deque(maxlen=32)
for digit in data[0]:
    d.append(digit)
    if len(d) == 32 and d[0] == '1':
        print(f'found: {"".join(d)}')
Gruß, noisefloor
Ramset
User
Beiträge: 6
Registriert: Sonntag 8. Januar 2023, 17:50

Hey noisefloor!

WOW..!! 1000 Dank, das ist die Lösung :) Super, Klasse!!! :)
Sirius3
User
Beiträge: 18274
Registriert: Sonntag 21. Oktober 2012, 17:20

@Ramset: Du hast doch gar nicht versucht herauszufinden, wie man das start-Argument von find benutzt. Hier fertige Lösungen abzugreifen wird Dich nicht sehr weit bringen.
Ramset
User
Beiträge: 6
Registriert: Sonntag 8. Januar 2023, 17:50

@ Sirius3: ich habe lange mit find() experimentiert, hat nicht funktioniert... die Lösung von noisefloor arbeitet so, wie es funktionieren soll... also bin ich sehr dankbar für die schnelle Hilfe und sehr zufrieden damit :)
Sirius3
User
Beiträge: 18274
Registriert: Sonntag 21. Oktober 2012, 17:20

Dann wäre es ja ein Möglichkeit, hier zu zeigen, wie Du versucht hast, find zu benutzen, damit wir konkret helfen können.
Ramset
User
Beiträge: 6
Registriert: Sonntag 8. Januar 2023, 17:50

Der Code von noisefloor ist in mein Prog eingebunden und tut, was er tun soll, somit ist der Fall abgeschlossen und ich bedanke mich für eure Hilfe!! Thumbs Up!!
Antworten