Seite 1 von 1

Simple Tupel Frage...

Verfasst: Freitag 9. November 2007, 19:40
von nemomuk
Hallo,

also ich bin Anfänger in Python und habe jetzt ein Tupel aus einer Datenbank zurückerhalten...

wenn ich jetzt den "result" ganz einfach "print"e dann bekomme ich sowas:
(('fghghjdghjthhjrzjrtzjrghjgfhjthjrtjhtzk',), ('tzkjuzlirfgnhjtzkjrthr',))
Wien nennt man sowas? Ein 2-dimensionales Tupel?

nun habe ich versucht die einzelnen Werte so abzurufen:

Code: Alles auswählen

x = ()
for i in result:
	c = result[i]
	x.extend(c)
for n in x:
	print x[n]
Nur leider geht das nicht und zweitens ist es nicht besonders schön...

Kann man nicht irgendwie direkt auf die einzelnen Werte zugreifen? Oder wo ist mein Fehler?

Danke!

Verfasst: Freitag 9. November 2007, 19:47
von nemomuk
sehe gerade, dass ich einen logischen Fehler drin hatte...
und man tuples nicht extenden kann...

neuer Code...:

Code: Alles auswählen

x = []
for i in result:
	x.extend(i)
for n in x:
	print n
Nur, es besteht die Frage, ob das nicht noch einfacher geht?

Verfasst: Freitag 9. November 2007, 19:49
von Leonidas
Du hast einfach mehrere Tupel in einem Tupel verschachtelt.

Zugreifen darauf kannst du so:

Code: Alles auswählen

for one in result:
    for two in one:
        print two
SchneiderWeisse hat geschrieben:sehe gerade, dass ich einen logischen Fehler drin hatte...
und man tuples nicht extenden kann...
Ja, Tupeln sind immutable. Das heißt aber nicht, dass man auf deren Werte nicht zugreifen könnte.

Verfasst: Freitag 9. November 2007, 19:50
von nemomuk
Danke!

Ich sehe, man muss in Python etwas anders denken, aber man kann es sehr schön lösen!

Verfasst: Freitag 9. November 2007, 19:51
von windner
Das ist ein tuple, das zwei tuples enthält, die jeweils einen string enthalten.

Also:

Code: Alles auswählen

>>> x=(('fghghjdghjthhjrzjrtzjrghjgfhjthjrtjhtzk',), ('tzkjuzlirfgnhjtzkjrthr',))
>>> for e in x: print e[0]
fghghjdghjthhjrzjrtzjrghjgfhjthjrtjhtzk
tzkjuzlirfgnhjtzkjrthr

Verfasst: Freitag 9. November 2007, 21:25
von nemomuk
Danke für die Andworten!

eine Frage noch:
angenommen ich habe zwei results die als Tupel zurückgeliefert werden:

Code: Alles auswählen

result1 = ((1,),(2,),(3,))
result2 = (("user1",),("user2",),("user3",))
und ich möchte dass nach jedem Wert von result1 einer von result2 folgt...
(jetzt mal abgesehen von der "Qualität der Datenbankstruktur")

Danke!

Verfasst: Freitag 9. November 2007, 21:39
von BlackVivi
:)

Code: Alles auswählen

In [4]: zip(result1, result2)
Out[4]: [((1,), ('user1',)), ((2,), ('user2',)), ((3,), ('user3',))]

Verfasst: Freitag 9. November 2007, 21:50
von Leonidas
Und wenn man wirklich ein Tupel hinter dem anderen haben will (d.h. ohne die zusätzlichen Tupel zu denen `zip` die Ergebnisse packt):

Code: Alles auswählen

sum([list(r) for r in zip(result1, result2)], [])
Und nun mit Generatoren :)

Code: Alles auswählen

from itertools import izip
sum((list(r) for r in izip(result1, result2)), [])

Verfasst: Samstag 10. November 2007, 08:59
von nemomuk
Danke, ich hab jetzt einfach die Methode von Blackvivi verwendet...
und habe noch ein 3. for eingebaut...

Für die, die es interessiert: und die vllt. mal die Forumssuche verwenden sollten ;) :

Code: Alles auswählen

result = zip(result1, result2)
print "Tupel von username und userid in 2 verschiedenen Queries:<br>", result, "<br>"
for one in result:
	for two in one:
		for three in two:
			print three
	print "<br>"