it-swarm.com.de

<Generator object <genexpr> abrufen

Ich habe 2 Listen:

first_lst = [('-2.50', 0.49, 0.52), ('-2.00', 0.52, 0.50)]
second_lst = [('-2.50', '1.91', '2.03'), ('-2.00', '1.83', '2.08')]

Ich möchte folgendes nachrechnen:

0.49 mit 1.91 multiplizieren (die entsprechenden Werte aus first_lst und second_lst) und 0.52 mit 2.03 multiplizieren (entsprechende Werte auch). Ich möchte das unter der Bedingung tun, dass die Werte an der Position 0 in jedem entsprechenden Tupel idential sind, also -2.50 == -2.50 usw. Natürlich machen wir die gleiche Mathematik auch für das Remanieren von Tupeln.

Mein Code:

[((fir[0], float(fir[1])*float(sec[1]), float(fir[2])*float(sec[2])) for fir in first_lst) for sec in second_lst if fir[0] == sec[0]]

Erzeugt jedoch ein Objekt:

[<generator object <genexpr> at 0x0223E2B0>]

Können Sie mir helfen, den Code zu reparieren?

8
nutship

Sie müssen Tuple() oder list() verwenden, um diesen Generatorausdruck in eine list oder Tuple zu konvertieren:

[Tuple((fir[0], fir[1]*sec[1], fir[2]*sec[2]) for fir in first_lst)\
                               for sec in second_lst if fir[0] == sec[0]]

Arbeitsversion Ihres Codes:

>>> first_lst = [Tuple(float(y) for y in x) for x in first_lst]
>>> second_lst = [Tuple(float(y) for y in x) for x in second_lst]

>>> [((fir[0],) + Tuple(x*y for x, y in Zip(fir[1:], sec[1:]))) \
                  for fir in first_lst for sec in second_lst if fir[0]==sec[0]]
[(-2.5, 0.9359, 1.0555999999999999), (-2.0, 0.9516000000000001, 1.04)]
14

Berücksichtigen Sie, dass Ihr first_lst und second_lst wie folgt definiert sind.

>>> first_lst = [('-2.50', '0.49', '0.52'), ('-2.00', '0.52', '0.50')]
>>> second_lst = [('-2.50', '1.91', '2.03'), ('-2.00', '1.83', '2.08')]

Das folgende Listenverständnis kann hilfreich sein.

>>> [Tuple((float(elem[0][0]), float(elem[0][1])*float(elem[1][1]), float(elem[0][2])*float(elem[1][2]))) for elem in Zip(first_lst, second_lst) if elem[0][0]==elem[1][0]]
[(-2.5, 0.9359, 1.0555999999999999), (-2.0, 0.9516000000000001, 1.04)]
1
Sukrit Kalra

Es gibt zwei Probleme zu betrachten.

Der ursprüngliche Code generiert den Fehler:

>>> first_lst = [('-2.50', 0.49, 0.52), ('-2.00', 0.52, 0.50)]
>>> second_lst = [('-2.50', '1.91', '2.03'), ('-2.00', '1.83', '2.08')]
>>> [((fir[0], float(fir[1])*float(sec[1]), float(fir[2])*float(sec[2])) for fir in first_lst) for sec in second_lst if fir[0] == sec[0]]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 1, in <listcomp>
NameError: name 'fir' is not defined
>>>

und <generator object <genexpr> message wird erwähnt.

1) Korrigieren wir den Code mit minimalem Änderungsaufwand, indem wir Listenverständnis erstellen :

>>> first_lst = [('-2.50', 0.49, 0.52), ('-2.00', 0.52, 0.50)]
>>> second_lst = [('-2.50', '1.91', '2.03'), ('-2.00', '1.83', '2.08')]
>>> [(fir[0],fir[1]*float(sec[1]),fir[2]*float(sec[2])) for fir in first_lst for sec in second_lst if fir[0] == sec[0]] # list comprehension
[('-2.50', 0.9359, 1.0555999999999999), ('-2.00', 0.9516000000000001, 1.04)]
>>>

2) Im Originalcode ist die Klammer nach first_lst) falsch platziert. Wenn wir diese Klammer nach dem sec[0] anstelle des Listenverständnisses setzen, erhalten wir Generatorausdruck . Und das wird die <generator object <genexpr> Nachricht verursachen:

>>> [((fir[0],fir[1]*float(sec[1]),fir[2]*float(sec[2])) for fir in first_lst for sec in second_lst if fir[0] == sec[0])]  # generator object
[<generator object <genexpr> at 0x00000184EEDE29E8>]

In Bezug auf die Syntax besteht der einzige Unterschied darin, dass man Klammern anstelle von eckigen Klammern verwendet.

Hinweis: Bei Bedarf gibt es zwei Möglichkeiten, ein Generatorobjekt in die Liste zu konvertieren:

2a) Entpacken Sie das Objekt in die Liste mit dem Sternchen (*)

>>> [*((fir[0],fir[1]*float(sec[1]),fir[2]*float(sec[2])) for fir in first_lst for sec in second_lst if fir[0] == sec[0])]
[('-2.50', 0.9359, 1.0555999999999999), ('-2.00', 0.9516000000000001, 1.04)]
>>>

2b) Verwenden Sie explizit list()

>>> list((fir[0],fir[1]*float(sec[1]),fir[2]*float(sec[2])) for fir in first_lst for sec in second_lst if fir[0] == sec[0])
[('-2.50', 0.9359, 1.0555999999999999), ('-2.00', 0.9516000000000001, 1.04)]
>>>
0
sg7