Variable etwas anders ausgeben

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.
Graf2.0
User
Beiträge: 23
Registriert: Montag 15. Januar 2018, 21:26
Wohnort: Hamburg

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.
nezzcarth
User
Beiträge: 1633
Registriert: Samstag 16. April 2011, 12:47

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?
Graf2.0
User
Beiträge: 23
Registriert: Montag 15. Januar 2018, 21:26
Wohnort: Hamburg

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:
__deets__
User
Beiträge: 14522
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
Graf2.0
User
Beiträge: 23
Registriert: Montag 15. Januar 2018, 21:26
Wohnort: Hamburg

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.
__deets__
User
Beiträge: 14522
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
Graf2.0
User
Beiträge: 23
Registriert: Montag 15. Januar 2018, 21:26
Wohnort: Hamburg

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.
sebastian0202
User
Beiträge: 168
Registriert: Montag 9. Mai 2016, 09:14
Wohnort: Berlin

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.
Graf2.0
User
Beiträge: 23
Registriert: Montag 15. Januar 2018, 21:26
Wohnort: Hamburg

Das ist ein wunderbarer Ansatz. DANKE! Ich werde es versuchen umzusetzen und melde mich später dann nochmal.
nezzcarth
User
Beiträge: 1633
Registriert: Samstag 16. April 2011, 12:47

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.
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

@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.
Graf2.0
User
Beiträge: 23
Registriert: Montag 15. Januar 2018, 21:26
Wohnort: Hamburg

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.
nezzcarth
User
Beiträge: 1633
Registriert: Samstag 16. April 2011, 12:47

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'}
)
Graf2.0
User
Beiträge: 23
Registriert: Montag 15. Januar 2018, 21:26
Wohnort: Hamburg

Mein englisch ist nicht so toll aber ich werde mein bestes versuchen.
Könntest du mir vielleicht bei meinem oben beschriebenem Problem helfen?
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

Das Einfachste ist immer noch modulo:

Code: Alles auswählen

import string
abc = string.lowercase
c = abc[(i + k) % len(abc)]
Graf2.0
User
Beiträge: 23
Registriert: Montag 15. Januar 2018, 21:26
Wohnort: Hamburg

schön, aber was bedeutet das was ist string und von wo kommen auf einmal i und k. Kannst du mir das erkläre.
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

@Graf2.0: bei Dir sind das Spalte und Zeile.
Graf2.0
User
Beiträge: 23
Registriert: Montag 15. Januar 2018, 21:26
Wohnort: Hamburg

Ahh verstehe. hab es schon ausprobiert aber was genau tun diese zwei Zeilen
Graf2.0
User
Beiträge: 23
Registriert: Montag 15. Januar 2018, 21:26
Wohnort: Hamburg

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
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

@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.
Antworten