replacefunktion in forschleife

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
timderheutige
User
Beiträge: 1
Registriert: Samstag 1. Mai 2021, 14:43

Hallo ich arbeite gerade an einem simplen verschlüsselungsalgorythmus, es werden die Buchstaben von a bis z in einen Schlüssel umgewandelt. Dann nehme ich eine beliebige Nachricht und ersetze im for loop nacheinander die einzelnen buchstaben, problem ist aber das auch teile der schon umgewandelten schlüsseln auch mit umgewandelt werden, wie löse ich das Problem?

Code:

Code: Alles auswählen

import random
import string

global quelle
global quelle_b

quelle=string.ascii_letters[0:26]
quelle_b= ""

def gen():
          text=input("Nachricht")
          for xy in quelle:
                    yx=xy
                    xy=random.choice(quelle)+random.choice(quelle)+random.choice(quelle)+random.choice(quelle)
                    print(yx,"=",xy)
                    text=text.replace(yx,xy)
                    print(text)
                    
gen()
ausgabe:
Nachricht
hallo welt
a = dpll
hdpllllo welt
b = cepg
hdpllllo welt
c = csis
hdpllllo welt
d = jyrd
hjyrdpllllo welt
e = anon
hjyrdpllllo wanonlt
f = bvvj
hjyrdpllllo wanonlt
g = uebk
hjyrdpllllo wanonlt
h = pfem
pfemjyrdpllllo wanonlt
i = ksnl
pfemjyrdpllllo wanonlt
j = jtds
pfemjtdsyrdpllllo wanonlt
k = dnpv
pfemjtdsyrdpllllo wanonlt
l = efhv
pfemjtdsyrdpefhvefhvefhvefhvo wanonefhvt
m = iscp
pfeiscpjtdsyrdpefhvefhvefhvefhvo wanonefhvt
n = ihjr
pfeiscpjtdsyrdpefhvefhvefhvefhvo waihjroihjrefhvt
o = vfmd
pfeiscpjtdsyrdpefhvefhvefhvefhvvfmd waihjrvfmdihjrefhvt
p = egdj
egdjfeiscegdjjtdsyrdegdjefhvefhvefhvefhvvfmd waihjrvfmdihjrefhvt
q = tzlv
egdjfeiscegdjjtdsyrdegdjefhvefhvefhvefhvvfmd waihjrvfmdihjrefhvt
r = jnyf
egdjfeiscegdjjtdsyjnyfdegdjefhvefhvefhvefhvvfmd waihjjnyfvfmdihjjnyfefhvt
s = muyg
egdjfeimuygcegdjjtdmuygyjnyfdegdjefhvefhvefhvefhvvfmd waihjjnyfvfmdihjjnyfefhvt
t = coac
egdjfeimuygcegdjjcoacdmuygyjnyfdegdjefhvefhvefhvefhvvfmd waihjjnyfvfmdihjjnyfefhvcoac
u = pxay
egdjfeimpxayygcegdjjcoacdmpxayygyjnyfdegdjefhvefhvefhvefhvvfmd waihjjnyfvfmdihjjnyfefhvcoac
v = tkui
egdjfeimpxayygcegdjjcoacdmpxayygyjnyfdegdjefhtkuiefhtkuiefhtkuiefhtkuitkuifmd waihjjnyftkuifmdihjjnyfefhtkuicoac
w = lbfb
egdjfeimpxayygcegdjjcoacdmpxayygyjnyfdegdjefhtkuiefhtkuiefhtkuiefhtkuitkuifmd lbfbaihjjnyftkuifmdihjjnyfefhtkuicoac
x = inzv
egdjfeimpinzvayygcegdjjcoacdmpinzvayygyjnyfdegdjefhtkuiefhtkuiefhtkuiefhtkuitkuifmd lbfbaihjjnyftkuifmdihjjnyfefhtkuicoac
y = ukvm
egdjfeimpinzvaukvmukvmgcegdjjcoacdmpinzvaukvmukvmgukvmjnukvmfdegdjefhtkuiefhtkuiefhtkuiefhtkuitkuifmd lbfbaihjjnukvmftkuifmdihjjnukvmfefhtkuicoac
z = dfxg
egdjfeimpindfxgvaukvmukvmgcegdjjcoacdmpindfxgvaukvmukvmgukvmjnukvmfdegdjefhtkuiefhtkuiefhtkuiefhtkuitkuifmd lbfbaihjjnukvmftkuifmdihjjnukvmfefhtkuicoac
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

Die Sinnhaftigkeit dieses Verfahrens mal aussen vor lassend, Du musst entweder:
  • Sorge dafür tragen, dass die Eingabe nur einmal umgewandelt wird. Das geht z.B. in dem Du vorher alle Ersetzungsregeln kennst, d.h. mit einem Durchlauf alle Ersetzungen vornehmen kannst (one pass), oder die bereits ersetzten bei späteren Durchläufen ausklammerst (dafür speziell markierst).
oder
  • Mehrfachersetzungen erlauben und die Anzahl der Ersetzungen an einem Token mitspeichern
um die Rückabbildung noch vornehmen zu können.


Hier mal ein simples one-pass:

Code: Alles auswählen

REPLACEMENTS = {
  'a': ...,
  ...
  'z': ...
}
def encode(s, REPLACEMENTS):
  return ''.join(REPLACEMENTS[c] for c in s)
Bei der Wahl der Ersetzungen musst Du aufpassen, damit die Rückabbildung noch funktioniert (muss entscheidbar/kollisionsfrei bleiben, am einfachsten mit fester Breite zu erreichen).
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

Eingerückt wird immer mit 4 Leerzeichen pro Ebene, 10 sind viel zu viele.
Vergiss gleich wieder, dass es `global` gibt. So wie Du es benutzt, ist es eh falsch. Funktionen bekommen alles, was sie brauchen, über ihre Argumente und geben Ergebnisse per return zurück.
Wenn Du nur Kleinbuchstaben möchtests, dann benutze doch string.ascii_lowercase.
Warum hast Du eine for-Schleife über xy um das sofort in yx umzubennenen und xy zu überschreiben?
Statt Code 5-mal zu kopieren, benutzt man Schleifen.

Code: Alles auswählen

import random
import string

LETTERS = string.ascii_lowercase

def encrypt(text):
    for yx in LETTERS:
        xy = ''.join(random.choice(LETTERS) for _ in range(5))
        text = text.replace(yx, xy)
    return text

text = input("Nachricht")
print(encrypt(text))
Wenn Du willst, dass Ersetzungen nicht wieder ersetzt werden, dann benutze translate:

Code: Alles auswählen

def encrypt(text):
    return text.translate({
        ord(letter): ''.join(random.choices(LETTERS, k=5))
        for letter in LETTERS
    })
Antworten