Paare aus 2 Listen bilden

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.
Chilla258
User
Beiträge: 16
Registriert: Sonntag 30. Dezember 2012, 22:18

Hallöchen,

ich möchte aus 2 Listen Paare bilden.

Das ganze kann man sich so vorstellen:

>>> PaareBilden(["k", "m", "p"], ["b", "o"])
[('k', 'b'), ('k', 'o'), ('m', 'b'), ('m', 'o'), ('p', 'b'), ('p', 'o')]

so soll es mal aussehen....die funktion bekommt also 2 listen und sol daraus alle möglichen paare bilden und als tupel in einer liste ausgeben....soweit die idee.

Kann mir da jemand helfen wie der Spaß funktioniert?

Liebe Grüßchen...
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
Sirius3
User
Beiträge: 17746
Registriert: Sonntag 21. Oktober 2012, 17:20

versuchs mal mit 2 for-Schleifen.
Chilla258
User
Beiträge: 16
Registriert: Sonntag 30. Dezember 2012, 22:18

ich bin leider ein blutiger anfänger und weiß mir grade nicht wirklich zu helfen :( hab gar keine vorstellung wie das ganze aussehen soll, muss es aber bis nächste woche haben....
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Hast du denn einen Ansatz? Sonst versuche mal zu beschreiben, wie du vorgehen willst.
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
Chilla258
User
Beiträge: 16
Registriert: Sonntag 30. Dezember 2012, 22:18

wenn ich das in dem link befolge, kommt das hier:

<generator object product at 0x037406E8>

damit kann ich leider nichts anfangen. was soll mir das bitte sagen?
Benutzeravatar
pixewakb
User
Beiträge: 1412
Registriert: Sonntag 24. April 2011, 19:43

Das du ein Generator-Objekt erstellt hast, du kannst auf die einzelnen Elemente der Liste mit einer for i in Generator: print(i) zugreifen. Willst du die Paare als Tupel erhalten oder als Liste???

Du kannst einmal das hier versuchen:

Code: Alles auswählen

def PaareBilden(liste1,liste2):
    ''' Deine Funktion, die eine Liste
    mit Elementen vom Typ tuple zurückgibt.

    '''
    ergebnisListe = []
    
    for item1 in liste1:

        for item2 in liste2:

            paar = item1, item2
            
            ergebnisListe.append(paar)
            
    return ergebnisListe


liste1 = [1,2,3]
liste2 = [4,5,6]

for paar in PaareBilden(liste1,liste2):
    print(paar)
Chilla258
User
Beiträge: 16
Registriert: Sonntag 30. Dezember 2012, 22:18

selbst mit for i in generator: print(i) kommt diese meldung... :(

eigentlich sollen die gebildeten paar als eine liste von tupel ausgegeben werden.

hier mein ansatz (an link orientiert):

def PaareBilden(liste1,liste2):
pools = map(tuple, liste1) * liste2.get("repeat, 1)
ergebnis = [[]]
for pool in pools:
ergebnis = [x+[y] for x in ergebnis for y in pool]
for prod in ergebnis:
yield tuple(prod)

versuche ich es dann auszuführen, kommt das hier:
>>> PaareBilden(["a", "b", "c", "d"], ["bla", "blubb"])
<generator object PaareBilden at 0x0270C058>
>>> for i in generator:
print(i)



Traceback (most recent call last):
File "<pyshell#38>", line 1, in <module>
for i in generator:
NameError: name 'generator' is not defined

was mache ich falsch?
Benutzeravatar
pixewakb
User
Beiträge: 1412
Registriert: Sonntag 24. April 2011, 19:43

Setz deinen Quellcode bitte in python-tags, sonst kann das nicht schnell rauskopiert werden und ist nicht gut händelbar. Wir können deinen Quellcode dann nicht rauskopieren und testen, d. h. wir können deinen Fehler nicht reproduzieren und dir nicht sinnvoll antworten.
Chilla258
User
Beiträge: 16
Registriert: Sonntag 30. Dezember 2012, 22:18

oh, tut mir leid....hier nochmal:

Code: Alles auswählen

>>> def PaareBilden(liste1,liste2):
	pools = map(tuple, liste1) * liste2.get("repeat", 1)
	ergebnis = [[]]
	for pool in pools:
		ergebnis = [x+[y] for x in ergebnis for y in pool]
	for prod in ergebnis:
		yield tuple(prod)

		
>>> PaareBilden(["a", "b", "c", "d"], ["bla", "blubb"])
<generator object PaareBilden at 0x02714FA8>
>>> for i in generator:
	print (i)

	

Traceback (most recent call last):
  File "<pyshell#62>", line 1, in <module>
    for i in generator:
NameError: name 'generator' is not defined
BlackJack

@Chilla258: Die Ausnahme sagt Dir das der Name `generator` nicht definiert ist. Ist er ja auch nicht. Du musst das Ergebnis der Funktion schon an einen Namen binden oder direkt in der Schleife verwenden.
Chilla258
User
Beiträge: 16
Registriert: Sonntag 30. Dezember 2012, 22:18

hmm, stimmt....
aber mir wird ja <generator object PaareBilden at 0x025DC198> das hier ausgegeben....python müsste demnach ja wissen was der generator ist.
wie kann ich den denn dann in meiner funktion definieren?
könnte mir jemand ein beispiel geben, bitte?

und wie könnte ich das in eine for schleife einbinden?
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

BlackJack hat es Dir doch schon erklärt... Du musst Das Ergebnis Deines Funktionsaufrufes an einen Namen binden - oder direkt über das Ergebnis iterieren...
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
BlackJack

@Chilla258: Python *wusste* mal das es den Generator gab, denn er wird ja in der Zeile nicht *an einen Namen gebunden*. Die Funktion gibt etwas zurück und das wird hier einfach nur in der Python-Shell ausgegeben. Wenn Du es nicht einem Namen zuweist oder den Aufruf direkt im Schleifenkopf durchführst, dann ist das Ergebnis abgesehen von der Ausgabe im Terminalfenster weg.

Und warum implementierst Du die `itertools.product()`-Funktion eigentlich ”selbst”? Die Funktion ist nur ein Beispiel was das gleiche Ergebnis wie `product()` liefert, aber ineffizienter ist. Das steht da auch.
Chilla258
User
Beiträge: 16
Registriert: Sonntag 30. Dezember 2012, 22:18

ich krieg das ergebnis einfach nicht ausgegeben. ich bin grad zu doof dazu.
wie muss das ganze denn dann aussehen?
kann mir bitte jemand ein beispiel geben? :( ich bin schon völlig verzweifelt
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Chilla258 hat geschrieben: kann mir bitte jemand ein beispiel geben? :( ich bin schon völlig verzweifelt
Beispiel:

Code: Alles auswählen

name = "Hyperion"
print(name)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Chilla258
User
Beiträge: 16
Registriert: Sonntag 30. Dezember 2012, 22:18

wie man sowas ausgibt, krieg ich auch grade noch so hin ;) so doof bin ich dann auch wieder nicht....
aber diese funktion gibt mir immer nur diesen generator aus....das macht mich grad echt wahnsinnig -.-
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Code: Alles auswählen

In [1]: import itertools

In [2]: itertools.product('hier', 'das', 'beispiel')
Out[2]: <itertools.product at 0x2e7a320>

In [3]: list(itertools.product('hier', 'das', 'beispiel'))
Out[3]: 
[('h', 'd', 'b'),
 ('h', 'd', 'e'),
 ('h', 'd', 'i'),
 ('h', 'd', 's'),
 ('h', 'd', 'p'),
 ('h', 'd', 'i'),
 ('h', 'd', 'e'),
 ('h', 'd', 'l'),
 ('h', 'a', 'b'),
 ('h', 'a', 'e'),
 ('h', 'a', 'i'),
 ('h', 'a', 's'),
 ('h', 'a', 'p'),
 ('h', 'a', 'i'),
 ...
Generatoren sind Objekte, die ihren "Inhalt" erst auf expliziten Wunsch erzeugen und sowas kann man zum Beispiel mit `list` erzwingen.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Chilla258 hat geschrieben:wie man sowas ausgibt, krieg ich auch grade noch so hin ;) so doof bin ich dann auch wieder nicht....
aber diese funktion gibt mir immer nur diesen generator aus....das macht mich grad echt wahnsinnig -.-
Ja, aber da Du das Generator-Objekt *nicht* an einen Namen bindest, kannst Du es eben auch nicht ausgeben... genau das sagte die Fehlermeldung :roll:
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
pixewakb
User
Beiträge: 1412
Registriert: Sonntag 24. April 2011, 19:43

Ich hab da mal eine Frage zu:

Code: Alles auswählen

def PaareBilden(liste1,liste2):
        pools = map(tuple, liste1) * liste2.get("repeat", 1)
        ergebnis = [[]]
        for pool in pools:
                ergebnis = [x+[y] for x in ergebnis for y in pool]
        for prod in ergebnis:
                yield tuple(prod)
Wenn ich das richtig sehe, dann ist das mit liste2.get(...) ein Fehler, weil hier tatsächlich eine Liste übergeben wird und keine Argumente, eigentlich sollten bei liste2 etwas wie "repeat=4" übergeben werden, [s]wobei der get-Befehl dann genau einmal nach dem repeat sucht? Verstehe ich die Zeile richtig?[/s] das ist tatsächlich ein dictionary und mit dem get-Befehl wird darauf zugegriffen, wobei dann aber der Wert 1 zugewiesen wird, falls kein Wert spezifiziert ist (Standardwert).

Eine weitere Frage betrifft das ergebnis = [[]], wobei ich mich frage, welchen Sinn es macht die verschachtelte Liste zuzuweisen, denn der Typ "Liste" bleibt unverändert und bei jedem Mal wird in der for-Schleife das Ergebnis eh geändert, d. h. das [[]] - Ok, ich sehe gerade, dass eine weitere for-Schleife aufs Ergebnis zugreift :D Der Quellcode ist mir (noch) zu hoch. Ich teste mich gerade über die Konsole ran, was der Quelltext eigentlich macht...
Antworten