Seite 1 von 3

Variable etwas anders ausgeben

Verfasst: Montag 15. Januar 2018, 21:34
von Graf2.0
Hi alle zusammen,
ich habe schon ein bisschen an programmier Erfahrung und habe vor den Inhalt von der Variable x1 durch x2 so auszugeben:

Code: Alles auswählen

x1 = "nice"
x2 = "x" + str(1)

print x2
natürlich ist mir klar dass das nicht funktioniert aber ich hoffe das stellt gut meinen plan dar und ermöglicht es euch mir zu folgen und somit besser zu helfen.
Danke im voraus.

Re: Variable etwas anders ausgeben

Verfasst: Montag 15. Januar 2018, 21:40
von nezzcarth
Diese Art von Metaprogrammierung ist zwar möglich, in der Regel aber die falsche Lösung für ein Problem; die Anzahl der Situationen, wo man so etwas wirklich machen will, ist sehr niedrig. Also: Was hast du vor?

Re: Variable etwas anders ausgeben

Verfasst: Montag 15. Januar 2018, 21:51
von Graf2.0
Ich habe eine verschiedene listen die ich von x1-x26 benannt habe und da man keine variable nur mit einer zahl benennen kann habe ich das mit dem x versucht. Kurz gesagt ich bekomme ein Ergebnis aus einer Funktion von 1-26 und dieses Ergebnis soll dann eine der Listen ansprechen.
Ergibt das Sinn?? :lol:

Re: Variable etwas anders ausgeben

Verfasst: Montag 15. Januar 2018, 22:35
von __deets__
Nicht wirklich. Wenn du so etwas willst, benutzt man eine geeignete Datenstruktur. Zum Beispiel eine Liste, in der deine Listen dann per Index zugreifest sind. Oder einvWörterbuch.

Re: Variable etwas anders ausgeben

Verfasst: Montag 15. Januar 2018, 22:51
von Graf2.0
nezzcarth hat geschrieben:Diese Art von Metaprogrammierung ist zwar möglich, in der Regel aber die falsche Lösung für ein Problem; die Anzahl der Situationen, wo man so etwas wirklich machen will, ist sehr niedrig. Also: Was hast du vor?
du sagst das es möglich ist. könntest du mir sagen wie? ich würde es dann damit mal ausprobieren und dann nochmal bescheid sagen ob wie es funktioniert.

Re: Variable etwas anders ausgeben

Verfasst: Montag 15. Januar 2018, 23:09
von __deets__
Es ist möglich genauso wie es möglich ist, dir selber den Blinddarm zu entfernen. Nur weil das geht ist das keine gute Idee.

Nochmal: so ein Problem löst man mit einer Datenstruktur. Nicht mit rumgepopel in den Innereien des Interpreters.

Re: Variable etwas anders ausgeben

Verfasst: Dienstag 16. Januar 2018, 16:34
von Graf2.0

Code: Alles auswählen

# -*- coding: cp1252 -*-
n = raw_input("Klartext: ")
p = raw_input("Schlüsselwort: ")
a = 0
b = 0
zeile = []
spalte = []
klartext_list = list(n)
schluesselwort_list = list(p)
abc = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']

while b != len(p):
    schluesselwort = schluesselwort_list[b]
    b += 1
    spalte_w = abc.index( schluesselwort ) +1
    spalte = spalte + [spalte_w]

while a != len(n):
    klartext = klartext_list[a]
    a += 1
    zeile_w = abc.index( klartext ) +1
    zeile = zeile + [zeile_w]


print zeile
print spalte

1 =  ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']
2 =  ['b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'a']
3 =  ['c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'a', 'b']
4 =  ['d', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'a', 'b', 'c']
5 =  ['e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'a', 'b', 'c', 'd']
6 =  ['f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'a', 'b', 'c', 'd', 'e']
7 =  ['g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'a', 'b', 'c', 'd', 'e', 'f']
8 =  ['h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'a', 'b', 'c', 'd', 'e', 'f', 'g']
9 =  ['i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']
10 = ['j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']
11 = ['k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j']
12 = ['l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k']
13 = ['m', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l']
14 = ['n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm']
15 = ['o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n']
16 = ['p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o']
17 = ['q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p']
18 = ['r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q']
19 = ['s', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r']
20 = ['t', 'u', 'v', 'w', 'x', 'y', 'z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's']
21 = ['u', 'v', 'w', 'x', 'y', 'z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't']
22 = ['v', 'w', 'x', 'y', 'z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u']
23 = ['w', 'x', 'y', 'z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v']
24 = ['x', 'y', 'z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w']
25 = ['y', 'z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x']
26 = ['z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y']

Also, das ist mein Skript. ich habe die Aufgabe bekommen das ich eine eigene Vigenere Verschlüsselung schreiben soll. Die Betonnung liegt auf eigene. Ihr habt bestimmt schon alle mal von Vigenere gehört also spare ich mir eine grasartige Erklärung aber meine Grund Idee war es dass ich Python wie mit einem Vigenere-Quadrat arbeiten lasse.
Als erstes habe ich die Position von jedem Buchstaben im Alphabet bestimmen lassen das man als Klartext eingibt. Das könnt ihr gerne ausprobieren, funktioniert wunderbar. Also wenn ihr die Variablen Zeile und Spalte mittels print ausgeben lasst bekommt ihr eine Liste von Zahlen die die Position der Buchstaben im Alphabet gleich sind.
Der zweite Schritt ist es die Tabelle zu benutzen. Mein plan war es das ich wenn z.B. Schluessel mein Geheimwort ist die Zeile mit der 19 anzusprechen und wenn mein Klartext Hallo Welt lautet ich dann um 8 Stellen in der 19. Zeile nach rechts gehe um dann den Buchstaben z als Geheimbuchstaben für H erhalten.
Da ich aber mit Zahlen arbeite ist es für mich unabdingbar das die Zeilen eine Zahl als Variablennamen bekommen, da das aber nicht möglich ist wollte ich das so wie anfangs demonstriert lösen. Und eben weil das nur für die Schule und nicht für eine Website die online ist und ich leider keine andere Möglichkeit sehe, dachte ich mir das diese Metaprogrammier-Methode doch zulässig wäre und man das hier als Ausnahmefall sehen kann. Außer ihr habt natürlich einen besseren Vorschlag.

Re: Variable etwas anders ausgeben

Verfasst: Dienstag 16. Januar 2018, 17:00
von sebastian0202
Hallo,



um die vielen Listen zu vermeiden, könntest du dir ja eine Funktion schreiben,
die deine ursprüngliche Variable abc nutzt und, um dein Beispiel zu nutzen, die Buchstaben um 19 Stellen verschiebt.
Die pop() und append() Funktionen von Listen kannst du dafür nutzen und mit der For-Schleife sorgst du auch für 19 Durchgänge.
Am Ende der Funktion gibst du dein neues abc zurück mit dem du dann deinen Text verschlüsseln kannst.

Re: Variable etwas anders ausgeben

Verfasst: Dienstag 16. Januar 2018, 17:03
von Graf2.0
Das ist ein wunderbarer Ansatz. DANKE! Ich werde es versuchen umzusetzen und melde mich später dann nochmal.

Re: Variable etwas anders ausgeben

Verfasst: Dienstag 16. Januar 2018, 17:12
von nezzcarth
Deine Variante, bei der das Quadrat sozusagen simuliert wird, kann man mit einem Dictionary in wenigen Zeilen abbilden. Als Schlüssel nimmt man Tupel der jeweiligen Zeilen- und Spalten-Buchstaben, als Wert den Buchstaben in der jeweiligen Zelle. Im string-Modul gibt es bereits übliche Zeicheninventare, die musst du nicht selbst aufschreiben.

Re: Variable etwas anders ausgeben

Verfasst: Dienstag 16. Januar 2018, 18:54
von Sirius3
@Graf2.0: statt der vielen Listen reicht es, eine Liste und den modulo-Operator zu verwenden. Statt der while-Schleifen solltest Du for-Schleifen verwenden. Damit sind a, b, klartext_liste und schluesselwort_liste überflüssig. n und p sollten noch besser benannt werden.

Re: Variable etwas anders ausgeben

Verfasst: Dienstag 16. Januar 2018, 19:12
von Graf2.0
sebastian0202 hat geschrieben: Hallo,
um die vielen Listen zu vermeiden, könntest du dir ja eine Funktion schreiben,
die deine ursprüngliche Variable abc nutzt und, um dein Beispiel zu nutzen, die Buchstaben um 19 Stellen verschiebt.
Die pop() und append() Funktionen von Listen kannst du dafür nutzen und mit der For-Schleife sorgst du auch für 19 Durchgänge.
Am Ende der Funktion gibst du dein neues abc zurück mit dem du dann deinen Text verschlüsseln kannst.

Code: Alles auswählen

n = raw_input("Klartext: ")
p = raw_input("Schlüsselwort: ")
a = 0
b = 0
c = 0
d = 0
zeile = []
spalte = []

n = n.lower()

klartext_list = list(n)
p = p.lower()

schluesselwort_list = list(p)
abc = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']
G_abc=['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']

while b != len(p):
    schluesselwort = schluesselwort_list[b]
    zeile_w = abc.index( schluesselwort ) 
    zeile.append(zeile_w)
    b += 1

while a != len(n):
    klartext = klartext_list[a]
    a += 1
    spalte_w = abc.index( klartext ) 
    spalte.append(spalte_w)

[b][u]while c < zeile[d]:     
    abc.extend(G_abc[c])
    abc.pop(c)
    c += 1
    [/u][/b]

print abc
print spalte
print zeile
hi nochmal der Vorschlag von sebastian0202schein mir am umsetzbarsten da ich 1. schon damit angefangen habe und 2. das mit dem dictionary trotz Google als Hilfe nicht verstehe, daher würde ich wenn möglich dabei bleiben mir meine komische Tabelle selbst zu generieren.
dabei ist aber ein Problem aufgetreten und zwar funktioniert der markierte Bereich zwar aber irgendwie nicht richtig.Die Idee war es die Buchstaben vorne zu entfernen und hinten wieder ranzuhängen. Aber warum auch immer überspringt es alle zwei Buchstaben das Löschen und das ranhängen will auch nicht richtig.

Re: Variable etwas anders ausgeben

Verfasst: Dienstag 16. Januar 2018, 19:47
von nezzcarth
Graf2.0 hat geschrieben:
sebastian0202 hat geschrieben: 2. das mit dem dictionary trotz Google als Hilfe nicht verstehe, daher würde ich wenn möglich dabei bleiben mir meine komische Tabelle selbst zu generieren.
Schade, aber musst du wissen. Zumindest das String-Modul sollte Google eigentlich allerdings kennen: https://docs.python.org/3/library/string.html

(Hier mal ein Ausschnitt aus der Tabelle, die meine Lösung generiert:

Code: Alles auswählen

In [2]: square
Out[2]:
{('A', 'A'): 'A',
('A', 'B'): 'B',
('A', 'C'): 'C',
…, 
('J', 'A'): 'J',
('J', 'B'): 'K',
('J', 'C'): 'L',
…,
('Z', 'X'): 'W',
('Z', 'Y'): 'X',
('Z', 'Z'): 'Y'}
)

Re: Variable etwas anders ausgeben

Verfasst: Dienstag 16. Januar 2018, 19:54
von Graf2.0
Mein englisch ist nicht so toll aber ich werde mein bestes versuchen.
Könntest du mir vielleicht bei meinem oben beschriebenem Problem helfen?

Re: Variable etwas anders ausgeben

Verfasst: Dienstag 16. Januar 2018, 20:06
von Sirius3
Das Einfachste ist immer noch modulo:

Code: Alles auswählen

import string
abc = string.lowercase
c = abc[(i + k) % len(abc)]

Re: Variable etwas anders ausgeben

Verfasst: Dienstag 16. Januar 2018, 20:12
von Graf2.0
schön, aber was bedeutet das was ist string und von wo kommen auf einmal i und k. Kannst du mir das erkläre.

Re: Variable etwas anders ausgeben

Verfasst: Dienstag 16. Januar 2018, 20:18
von Sirius3
@Graf2.0: bei Dir sind das Spalte und Zeile.

Re: Variable etwas anders ausgeben

Verfasst: Dienstag 16. Januar 2018, 20:40
von Graf2.0
Ahh verstehe. hab es schon ausprobiert aber was genau tun diese zwei Zeilen

Re: Variable etwas anders ausgeben

Verfasst: Dienstag 16. Januar 2018, 21:06
von Graf2.0
Gunnar hat geschrieben:Ja Kathrin,

den Fehler habe ich letzt auch gemacht und dazu sagte modelnine :
Iterieren über ein Objekt was verändert wird hat meißtens nicht die gewünschten Konsequenzen (bei Listen werden dann eine entsprechende Anzahl von Elementen übersprungen, bei Dicts bricht das Programm mit einer Exception ab).
Bei dir wurde der Schleifeninhalt nur zweimal ausgeführt, weil der Liste die items unter'm Hintern weggerissen wurden :wink:

Gruss,
Gunnar
Es scheint dass das nicht ungewöhnlich ist. In dem Forum steht zwar das sowas passieren kann aber nicht wie man das beheben denn ich finde das ist für einen Computer schon ein seltsamer Fehler. Hoffentlich könnt ihr mir sagen was der Grund ist warum bei der .pop Funktion nur die hälfte gelöscht wird.
Danke für die viele Hilfe an dieser Stelle :D

Re: Variable etwas anders ausgeben

Verfasst: Dienstag 16. Januar 2018, 21:47
von Sirius3
@Graf2.0: das was Du da aus dem Archiv ausgegraben hast, hat nichts mit Deinem Problem zu tun. Versuch mal zu erklären, was Du mit der while-Schleife zu tun versuchst, was das gewünschte und was das tatsächliche Ergebnis ist.