web-dev-qa-db-ja.com

<generatorオブジェクト<genexpr>を取得しています

2つのリストがあります。

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')]

次の計算をしたいのですが。

0.491.91first_lstsecond_lstの対応する値)を乗算し、0.522.03を乗算します(対応する値も)。対応する各タプルの0の位置の値が同一であるため、-2.50 == -2.50などの条件でこれを実行したいと思います。明らかに、残りのタプルにも同じ計算を行います。

私のコード:

[((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]]

ただし、いくつかのオブジェクトを生成します。

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

コードの修正を手伝ってもらえますか?

8
nutship

そのジェネレータ式をlistまたはTupleに変換するには、Tuple()またはlist()を使用する必要があります。

[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]]

コードの作業バージョン:

>>> 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

あなたのfirst_lstおよびsecond_lstは次のように定義されています。

>>> 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')]

次のリストの理解が役立つ場合があります。

>>> [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

注目すべき2つの問題があります。

元のコードはエラーを生成します:

_>>> 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
>>>
_

および_<generator object <genexpr>_メッセージが記載されています。

1) list comprehension を作成して、最小限の変更でコードを修正しましょう。

_>>> 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)元のコードでは、_first_lst_ _)_の後の括弧が誤って配置されています。リストの内包表記の代わりに_sec[0]_の後にそのブラケットを配置すると、 ジェネレータ式 が得られます。そして、それは_<generator object <genexpr>_メッセージを引き起こします:

_>>> [((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>]
_

構文に関して、唯一の違いは、角括弧の代わりに括弧を使用することです。

注:必要に応じて、ジェネレーターオブジェクトをリストに変換する方法は2つあります。

2a)アスタリスク(*)演算子を使用してオブジェクトをリストにアンパックします

_>>> [*((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)明示的に使用する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