3

ブール式に基づいて一連のタプルを平坦化するジェネレーターを探しています。私のデータは次のようになります。

my_data = ((3, 4), (None, 4), (5, 8), (None, 1), (None, 9)...)

私がやりたいのは、これを 1 次元の数値ジェネレーターにフラット化しNone、そうでない場合は各タプルの最初の項目を取得し、それ以外の場合は 2 番目の項目を取得することです。私の結果は、次のシーケンスを生成します。

3, 4, 5, 1, 9...

これを行う最も簡単な方法は、短絡を伴うブール式を使用することだと考えていますが、適切なジェネレーターを作成できないようです。ジェネレーター関数を定義できることはわかっていますが、これはかなり簡単ですが、内包表記でこれを行うことができるかどうか知りたいですか?

私の試み:

(x or y for subitem in my_data for x, y in subitem)

トレースバック:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 1, in <genexpr>
TypeError: 'int' object is not iterable
4

2 に答える 2

7
(x[0] or x[1] for x in my_data)

または代わりに、

(x or y for x,y in my_data)
于 2012-07-23T09:05:36.030 に答える
3

明示的にチェックする必要があるか、または次Noneのようなタプルがあなたをつまずかせる可能性があります。(0, None)(0, 1)

(x if x is not None else y for x,y in my_data)

例:

>>> my_data = ((3, 4), (None, 4), (5, 8), (None, 1), (0, None), (0, 1))
>>> [x or y for x,y in my_data]
[3, 4, 5, 1, None, 1]
>>> [x if x is not None else y for x,y in my_data]
[3, 4, 5, 1, 0, 0]
于 2012-07-23T09:15:24.307 に答える