Indexangabe in Dictionairies durch Variable?

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.
Benutzeravatar
sliwalker
User
Beiträge: 21
Registriert: Sonntag 29. Juni 2003, 20:16
Wohnort: Bielefeld

Indexangabe in Dictionairies durch Variable?

Beitragvon sliwalker » Dienstag 1. Juli 2003, 17:52

hi,

ich bin python anfänger, und hänge seit ein paar tagen in meinem project fest. ich würde gerne eine passwortabfrage schreiben,die benutzernamen mit passwörten vergleicht.dabei sollen diese elemente aus zwei listen stammen.

:shock: problem ist nur,das benutzername(Stelle x) mit passwort(Stelle x) übereinstimmen müssen. :?
gedacht hat ich, dass man mit hilfe von count(benutzername) in einer function, einen wert zurück bekommt, den man dan einer variablen zuweist, die man dann anstelle von "index" (z.b. list.insert(0, name)"index=0") einsetzt; also quasi--> var=count(name) list.insert(var, passwort).

ich hoffe jemand versteht was ich meine, bin eben noch anfänger. :wink:
Gast

Beitragvon Gast » Dienstag 1. Juli 2003, 18:25

Es gibt den Listen-Typ des Dictionarie(sp?), da kann man statt einer Position einen Namen als Index-Wert nehmen.

Wenn ich dich richtig verstanden hab willst du etwas in der art:

Code: Alles auswählen

passwoerter = {}    #Dic.wird initialisiert

#Erst mal Name und Passwort eintragen
name = input("Bitte gib deinen User-Namen ein: ")
code = input("Und nun bitte ein passwort: ")

#Hier wird im Wert 'name' der Inhalt 'code' zugefuegt
passwoerter[name] = code

#Nun die Abfrage
login_name = input("Bitte gib deinen User-Namen ein: ")
login_code = input("Und ihr Passwort? ")

if login_code == passwoerter[login_name]:
    print "Gratuliere, das Passwort ist richtig!"
else:
    print "Fehler, falsches Passwort!"
Benutzeravatar
Beyond
User
Beiträge: 227
Registriert: Freitag 6. September 2002, 19:06
Kontaktdaten:

Beitragvon Beyond » Dienstag 1. Juli 2003, 18:26

Ich würde zur Passwort-Abfrage ein Dictionary verwenden.

d= {'user1':'passwort1'}

Dann

if d.get(username, None) == passwd: print "Benutzer und Passwrt O.K."
Benutzeravatar
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Beitragvon Dookie » Dienstag 1. Juli 2003, 18:27

Hi sliwalker,

hmm etwas confus Deine Beschreibung.

Du hast also 2 Listen

Code: Alles auswählen

benutzer = ["Hans", "Gretel", "Peter", "Susi"]
passwords = ["asdf", "qwer", "hjkl", "yxcv"]

um jetzt Das Passwort für z.B. Gretel zu bekommen schreibst Du

Code: Alles auswählen

passwort = passwords[benutzer.index("Gretel")]

um ein Passwort zu Setzen schreibst Du

Code: Alles auswählen

passwords[benutzer.index("Gretel")] = "pwneu"

Achtung, das geht nur wenn für den index von Gretel schon ein Eintrag in der Passwortliste existiert, sonst arbeite lieber gleich mit einem Dictionary

Code: Alles auswählen

benutzer = {"Hans" : "asdf", "Gretel" : "qwer", "Peter" : "hjkl", "Susi" : "yxcv"}

dann bekommst Du mit

Code: Alles auswählen

benutzer.keys()
eine Liste mit den Benutzern und über

Code: Alles auswählen

passwd = benutzer["Gretel"]
das Passwort von Gretel oder mit

Code: Alles auswählen

passwd = benutzer[benutzer.keys()[1]]
das Passwort des 2. Benutzers (Zählung beginnt mit 0!)
und zum Setzen/Ändern des Passworts

Code: Alles auswählen

benutzer["Gretel"] = "neupw"

noch eleganter gehts wenn Du nicht nur Passwörter sondern auch andere Attribute für die Benutzer in das Dictionary packen willst so

Code: Alles auswählen

benutzer = {"Hans" : {"Passwort": "asdf"}, "Gretel" : {"Passwort": "qwer"}, "Peter" : {"Passwort":"hjkl"}, "Susi" : {"Passwort":"yxcv"}}

das Passwort bekommst Du dann über

Code: Alles auswählen

 passwort = benutzer["Peter"]["Passowrt"]



Gruß

Dookie
Benutzeravatar
sliwalker
User
Beiträge: 21
Registriert: Sonntag 29. Juni 2003, 20:16
Wohnort: Bielefeld

Vielen Dank

Beitragvon sliwalker » Dienstag 1. Juli 2003, 21:50

hi,

vielen dank für die schnelle hilfe.ich hätte nicht so schnell mit so vielen
nützlichen antworten gerechnet.

besonders die ausführungen von Dookie :wink: über die Dictionary Funktionen und Iterationen haben mir sehr geholfen.

nur:
wie erstellt man einträge im dictionary? :oops:

weitgehender bitte ich um einen link,der mir vielleicht bei der Schreibweise(Iteration) in Python und seine grundlegenden befehle weiterhelfen könnte. ich bin zwar im besitz einiger e-books und links, die beschäftigen sich aber meist mit grundlegender python programmierung(hello.world,calculator,phonebook,zahlenspiele,usw)
oder mit tiefgehenden sachen wie (verschiedene module,gui,usw)die tutorials die ich verstanden habe ,habe ich schon gemacht,
trotzdem fehlen mir noch zu viele befehle und schlüsselwörter und vor allem übungsaufgaben.
thx
Benutzeravatar
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Beitragvon Dookie » Dienstag 1. Juli 2003, 22:44

Hallo nochmal,

angenommen Du hast die einträge für jeden User in folgenden variablen:

Code: Alles auswählen

name, passwort, weitere_Infos1, weitere_Infos2

Dann kanst du die mit folgendem Code in das dictionary einlesen:

Code: Alles auswählen

benutzer[name]["Passwort"] = passwort
benutzer[name]["sonstiges1"] = weitere_Infos1
benutzer[name]["sonstiges2"] = weitere_Infos2

die variable name enthält dabei den namen als String.
hast Du die einträge in Listen

Code: Alles auswählen

daten = ["Hans", "hansispasswort", "ich@hans.tv", "www.hans.tv"]

dann geht das einlesen so:

Code: Alles auswählen

benutzer[daten[0]]["Passwort"] = daten[1]
benutzer[daten[0]]["sonstiges1"] = daten[2]
benutzer[daten[0]]["sonstiges2"] = daten[3]

um über ein Dictionary zu iterieren kommt wieder die for-schleife zum Einsatz.

Code: Alles auswählen

for key in benutzer.keys():
    print "Name =", key
    print "Passwort =",benutzer[key]["Passwort"]
    print "sonstiges2 =",benutzer[key]["sonstiges1"]



Gruß

Dookie
Benutzeravatar
sliwalker
User
Beiträge: 21
Registriert: Sonntag 29. Juni 2003, 20:16
Wohnort: Bielefeld

alles klar. funktioniert.

Beitragvon sliwalker » Mittwoch 2. Juli 2003, 16:01

super danke,

das programm läuft ohne fehler, mit dictionary.

auch wenns vielleicht nervt:
eine letzte frage dazu

kann ich das dictionary dauerhaft speicher?oder
wie schaffe ich es die benutzer + passwörter dauerhaft anzulegen?

ich hoffe nocheinmal auf Deine(Eure) Hilfe

cya sli

wer es mal durchgucken möchte:

print "SLI pre-Wall -- Secure Checking 2003a"
print "_____________________________________"

def menu():
print "(1) Login"
print "(2) New User"
print "(3) About"
print "(4) Quit"

def check():
if name in user:
if pasw==user[name]:
return 1
else:
return 2
else:
return 2

user = {}
menu()
auswahl=0
while auswahl<=3:
auswahl=input("Auswahl: ")
if auswahl==1:
name=raw_input("Benutzername: ")
pasw=raw_input("Passwort: ")
if check()==1:
print "Login erfolgreich... "
else:
print "Bitte Passwort und Benutzernamem ueberpruefen!"
elif auswahl==2:
name=raw_input("Benutzername: ")
pasw=raw_input("Passwort: ")
user[name]=pasw
elif auswahl==3:
print "Developed by SLi-T"
print "Version v03.7.1a"
print "Copyrights Reserved"
else:
print "Programm beendet."

ich weis das noch kleine fehler drin sind, und das man es auch bestimmt besser,kürzer,schneller usw schreiben kann. aber so hab ich es nunmal gemacht. für ideen die etwas bewirken bin ich dankbar.
Benutzeravatar
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Beitragvon Dookie » Mittwoch 2. Juli 2003, 18:03

Hi,

wenn Du Pythoncode postest, schliesse diesen in [code]...[/code] ein, dann bleiben die Einrückungen erhalten.


Dookie
Benutzeravatar
sliwalker
User
Beiträge: 21
Registriert: Sonntag 29. Juni 2003, 20:16
Wohnort: Bielefeld

ok.danke für den tipp.

Beitragvon sliwalker » Mittwoch 2. Juli 2003, 18:48

Code: Alles auswählen

print "SLI pre-Wall -- Secure Checking 2003a"
print "_____________________________________"

def menu():
    print "(1) Login"
    print "(2) New User"
    print "(3) About"
    print "(4) Quit"

def check():
    if name in user:
        if pasw==user[name]:
            return 1
        else:
            return 2
    else:
        return 2
   
user = {}
menu()
auswahl=0
while auswahl<=3:
    auswahl=input("Auswahl: ")
    if auswahl==1:
        name=raw_input("Benutzername: ")
        pasw=raw_input("Passwort: ")
        if check()==1:
            print "Login erfolgreich... "
        else:
            print "Bitte Passwort und Benutzernamem ueberpruefen!"
    elif auswahl==2:
        name=raw_input("Benutzername: ")
        pasw=raw_input("Passwort: ")
        user[name]=pasw
    elif auswahl==3:
        print "Developed by SLi-T"
        print "Version v03.7.1a"   
        print "Copyrights Reserved"
else:
    print "Programm beendet."


ok.thx
Benutzeravatar
NEBULA
User
Beiträge: 25
Registriert: Mittwoch 5. März 2003, 11:59
Wohnort: Kleve/NRW

Beitragvon NEBULA » Donnerstag 3. Juli 2003, 11:44

Hi,

zum Thema deine "Benutzerdatenbank" sprich dein Dictionary dauerhaft zu speichern, empfehle ich dir einen Blick in die Python-Doku und dort schau mal bei Pickle und cPickle rein.

Anzumerken ist dabei, dass die Daten beim serialisieren per Pickle nicht verschluesselt werden oder aehnliches.
Jeder der auf die Datei mit dem serialisierten Dictionary zugreifen kann, wird wohl alleine schon mit einem Texteditor die Passwoerter sehen koennen.

Ein bissel Schutz koenntest du dir schaffen, indem du die Datei mit Base64 encodierst und dann durchn Rotor jagst.
Passende Module dazu bringt Python mit ;)
Benutzeravatar
sliwalker
User
Beiträge: 21
Registriert: Sonntag 29. Juni 2003, 20:16
Wohnort: Bielefeld

stimmt

Beitragvon sliwalker » Donnerstag 3. Juli 2003, 14:27

hi,

ja klar.das man die passwörter mitn notepad sehen kann weis ich.
war auch im ersten moment nicht mein problem. :lol:
aber jetzt ist es das. :D

wegen der übersichtlichkeit des boards würde ich aber lieber dafür ein neues thema aufmachen, um anderen die danach möglicherweise suchen,das finden zu erleichtern :wink:
cya sli

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder