それで、私はx=[(12,), (1,), (3,)]
(タプルのリスト)を持っていて、x=[12, 1, 3]
可能な限り最良の方法で(整数のリスト)を望んでいますか?助けていただけますか?
5 に答える
あなたは「最高」とはどういう意味かを言いませんでしたが、おそらく「最もパイソン的」または「最も読みやすい」などを意味します。
F3AR3DLEGENDによって与えられるリスト内包は、おそらく最も単純です。リスト内包表記の読み方を知っている人なら誰でも、それが何を意味するのかすぐにわかります。
y = [i[0] for i in x]
ただし、多くの場合、実際にはリストは必要ありません。一度だけ繰り返すことができるものだけです。に10億個の要素がある場合、一度に1つの要素を反復処理するためだけにx
、10億y
個の要素を作成するのは悪い考えかもしれません。したがって、ジェネレータ式を使用できます。
y = (i[0] for i in x)
関数型プログラミングを好む場合は、を使用することをお勧めしますmap
。欠点はmap
、式だけでなく関数を渡す必要があることです。つまり、lambda
関数を使用する必要がありますitemgetter
。
y = map(operator.itemgetter(0), x)
Python 3では、これはジェネレーター式と同等です。が必要な場合はlist
、に渡しますlist
。Python 2では、list
;を返します。イテレータが必要な場合は、のitertools.imap
代わりにを使用してくださいmap
。
より一般的なフラット化ソリューションが必要な場合は、自分で作成することもできますが、この種の一般的なソリューションを探す価値は常にあります。実際、 「1レベルのネストをフラット化する」ために使用されるitertools
レシピがあります。flatten
したがって、それをコピーしてコード(またはpip install more-itertools
)に貼り付けると、次のように実行できます。
y = flatten(x)
どのようflatten
に実装されているか、次にどのようchain.from_iterable
に実装されているか、そしてどのように実装されているかを見るchain
と、ビルトインに関して同じことを書くことができることに気付くでしょう。しかし、なぜわざわざ、いつflatten
より読みやすく、明白になるのでしょうか。
最後に、汎用バージョンをネストされたリスト内包表記(またはもちろんジェネレータ式)に縮小する場合は、次のようにします。
y = [j for i in x for j in i]
ただし、ネストされたリスト内包表記は、書き込みと読み取りの両方で非常に簡単に誤解されます。(最初に最も単純な答えを出したのと同じ人物であるF3AR3DLEGENDも、入れ子になった理解を与えて、それを間違えたことに注意してください。彼がそれをやってのけることができない場合は、試してみませんか?)それほど悪くはありませんが、それでも、私flatten
ははるかに読みやすいと思います。
y = [i[0] for i in x]
ただし、これはタプルごとに 1 つの要素に対してのみ機能します。
ただし、タプルごとに複数の要素がある場合は、もう少し複雑なリスト内包表記を使用できます。
y = [i[j] for i in x for j in range(len(i))]
リファレンス:リスト内包表記
これを行うだけです:
x = [i[0] for i in x]
説明:
>>> x=[(12,), (1,), (3,)]
>>> x
[(12,), (1,), (3,)]
>>> [i for i in x]
[(12,), (1,), (3,)]
>>> [i[0] for i in x]
[12, 1, 3]
これが最も効率的な方法です。
x = [i for i, in x]
または同等に
x = [i for (i,) in x]
これは少し遅いです:
x = [i[0] for i in x]
マップ機能が使えます…。
map(lambda y: y[0], x)