list Element 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.
karsten k
User
Beiträge: 18
Registriert: Dienstag 12. August 2008, 19:25

Mittwoch 13. August 2008, 17:17

Hallo!
Ich möchte ein List-Element ausgeben, jedoch "direkt", d.H. die einzelnen Inhalte sollen direkt aneinandergereiht sein. Leider habe ich auch keine Ahnung wie man sowas nennt, weshalb ich euch um hilfe bitte ;)

gruß
Sage nie, was du weisst. Aber wisse stets, was du sagst!
Benutzeravatar
snafu
User
Beiträge: 5627
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Mittwoch 13. August 2008, 17:22

Man nennt es join.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Mittwoch 13. August 2008, 17:33

Und "join" geht so:

Code: Alles auswählen

>>> print ''.join(['x','y','z'])
xyz
karsten k
User
Beiträge: 18
Registriert: Dienstag 12. August 2008, 19:25

Mittwoch 13. August 2008, 20:31

Hallo!
Habe mir dass mal angesehen, funktioniert aber nicht :(

Code: Alles auswählen

  File "/home/karsten/Desktop/test.py", line 53, in generate_pw
    line = join(passwort)
NameError: global name 'join' is not defined
Muss man vielleicht noch etwas importieren?

Passwort wird so erstellt:

Code: Alles auswählen

passwort = [0]
und dann durch passwort.append Aufrufe erweitert

Was mache ich nun jetzt schon wieder falsch? :cry:

gruß karsten
Sage nie, was du weisst. Aber wisse stets, was du sagst!
Benutzeravatar
Hyperion
Moderator
Beiträge: 7472
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Mittwoch 13. August 2008, 20:42

join() ist keine Funktion, sondern eine Methode von String-Objekten. Du kannst es nur in Zusammenhang mit einem String anwenden. numerix hat Dir doch ein Beispiel gegeben.

Bei Dir wäre es eben:

Code: Alles auswählen

line = "".join(passwort)
Wozu wird das PW eigentlich in einer Liste gespeichert?
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Mittwoch 13. August 2008, 20:45

1. Du hast join() falsch eingesetzt. Sieh dir nochmal genau mein Beispiel an.

2. Was soll das denn für ein "passwort" sein: [0] ? Eine Liste mit einem Element und das ist 0?

3. Auch wenn du join() richtig verwendet hättest, hätte es nicht funktioniert, weil dein einziges Listenelement vom Typ int ist. Müsste eine Zeichenkette sein. Musst du vorher also noch umwandeln ...
karsten k
User
Beiträge: 18
Registriert: Dienstag 12. August 2008, 19:25

Mittwoch 13. August 2008, 20:47

Hallo!
Die beiden Beispiele habe ich mir angesehen, aber es funktioniert auch damit nicht :(
Dass Passwort wird zufällig generiert, manche Zahlen werden durch Buchstaben ersetzt, deswegen die Liste. Ist schwer zu verstehen, deswegen hier mal der gesamte Code:

Code: Alles auswählen

import Tkinter as tk
import random as rd


horizontal = "horizontal"
fontvar = "Waree"
passwort = [0]
def generate_pw():
    counter = 0
    string = ">"
    # soll nachher das Passwort generieren
    wert = bar.get()
    for i in range(wert):
	zahl = rd.randrange(9) # Zahl generieren, zufaellig
	zufall = rd.randrange(2) #Zufaelige Zahl, fuer Buchstabenersetzung
	if zufall == 1:

		if zahl == 0:
			passwort.append("O")

		if zahl == 1:
			passwort.append("i")

		if zahl == 2:
			passwort.append("z")
			
		if zahl == 3:
			passwort.append("e")
			
		if zahl == 4:
			passwort.append("a")
			
		if zahl == 5:
			passwort.append("s")
			
		if zahl == 6:
			passwort.append("G")
			
		if zahl == 7:
			passwort.append("L")
			
		if zahl == 8:
			passwort.append("B")
			
		if zahl == 9:
			passwort.append("G")
			
	else:
		passwort.append(zahl)

root = tk.Tk()
tk.Label(root, text="Dieses Programm generiert ihnen ein sicheres Passwort.", font=fontvar).pack()
tk.Label(root, text="Bitte geben Sie die Anzahl der zu verwendenen Stellen an!", font=fontvar).pack()
button = tk.Button(text="Generieren", command=generate_pw)
bar = tk.Scale(root, from_=0, to=200, orient=horizontal)
bar.pack()

button.pack()
root.mainloop()
//edit:
2. Was soll das denn für ein "passwort" sein: [0] ? Eine Liste mit einem Element und das ist 0?
Ja also dass mit der [0] ist um 'passwort' zu erstellen, sonst meckert er bei passwort.append nachher rum. Wusste nicht wie ich es sonst erstellen soll.
Musst du vorher also noch umwandeln ...
Wie heisst der Befehl? Kenne von C# nur foobar.ConvertToString, bloß wie er hier heisst weiss ich nicht :cry:
Sage nie, was du weisst. Aber wisse stets, was du sagst!
DasIch
User
Beiträge: 2478
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Mittwoch 13. August 2008, 20:51

Klar dass das nicht funktioniert, du rückst zumindest Zeile 14 nicht richtig ein.
Benutzeravatar
Craven
User
Beiträge: 223
Registriert: Dienstag 24. Januar 2006, 13:37

Mittwoch 13. August 2008, 20:55

karsten k hat geschrieben:Wie heisst der Befehl? Kenne von C# nur foobar.ConvertToString, bloß wie er hier heisst weiss ich nicht :cry:

Code: Alles auswählen

>>> str(7)
'7'
[code]q = 'q = %s; print q %% repr(q)'; print q % repr(q) [/code]
Benutzeravatar
Hyperion
Moderator
Beiträge: 7472
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Mittwoch 13. August 2008, 21:01

Hui ... das sieht alles andere als sauber aus!

Code: Alles auswählen

from random import choice

pw = []
chars = "01234abcdefgh"

# die 8 kann man ja auch noch variieren ;-)
for i in xrange(8):
    pw.append(choice(chars))
Geht sicherlich auch noch anders, aber so ist das besser als zig mal if zu nutzen! (Und das mit der Liste würde ich auch noch mal überdenken - es gibt durchaus Strings für so etwas)

Zum anderen

Code: Alles auswählen

dummy = ["a", "b"]
print "".join(dummy)
Geht. Aber Du hast ja auch Integers drin, dann klappt es natürlich nicht. Da wüßte ich auch keine Methode, außer eben eine eigene Funktion zu schreiben.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Mittwoch 13. August 2008, 21:06

Meine dringende Empfehlung: Lies dir das Tutorial durch und fang vorne an: http://docs.python.org/tut/tut.html

Dir fehlen grundlegende Sprachelemente von Python. Ohne deren Aneignung wirst du deutlich weniger Freude am Programmieren mit Python haben.

Nur ein Beispiel aus deinem Code: Die gesamten Zeilen 18-46 kannst du durch diese eine Zeile ersetzen:

Code: Alles auswählen

passwort.append("OizeasGLBG"[zahl])
karsten k
User
Beiträge: 18
Registriert: Dienstag 12. August 2008, 19:25

Mittwoch 13. August 2008, 21:16

Damn, da hab ichs mir ja mal wieder (unnötig) viel Arbeit gemacht, aber Python wird mir immer sympatischer :lol:

Hab mir gestern noch ein Buch bestellt, zusammen mit dem Tutorial werde ich doch die grundlegenden Sprachelemente besser -kennenlernen :)
Sage nie, was du weisst. Aber wisse stets, was du sagst!
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Mittwoch 13. August 2008, 22:01

Nicht das von Galileo, oder? :/
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Mittwoch 13. August 2008, 23:46

Eine elegante Möglichkeit wäre das hier:

Code: Alles auswählen

>>> from string import letters, digits
>>> from random import choice
>>> from itertools import imap, repeat
>>> ''.join(imap(choice, repeat(letters + digits, 10)))
'vkv26kVKOV'
TUFKAB – the user formerly known as blackbird
Benutzeravatar
str1442
User
Beiträge: 520
Registriert: Samstag 31. Mai 2008, 21:13

Mittwoch 13. August 2008, 23:53

Geht. Aber Du hast ja auch Integers drin, dann klappt es natürlich nicht. Da wüßte ich auch keine Methode, außer eben eine eigene Funktion zu schreiben.

Code: Alles auswählen

print "".join(map(str, range(20)))
Antworten