2013-02-26 13 views
9

私はx=[(12,), (1,), (3,)](タプルのリスト)を持っていて、x=[12, 1, 3](整数のリスト)を可能な限り最良にしたいですか?あなたは助けてもらえますか?Pythonのリストからintのリストに

+3

問題を解答に含めるには、編集してください。ありがとうございました。 – bernie

+0

は常に同じ形式のタプルですか? '(n、)'? –

+1

Py3kの代わりの 'zip(* x)[0]'または 'next(zip(* x))' – JBernardo

答えて

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

説明:List Comprehensions

+1

@pedro - はい、常に1つの要素を持ちます。 – NullException

+0

2番目の場合:シーケンスのシーケンスを平坦化する必要がある場合は、['itertools'](http://docs.python.org/2/library/itertools.html#recipes)docsにレシピがあります。フラット化する。それはおそらくそれとリストの理解の両方を理解する価値があります。 – abarnert

+1

'for'の順序を逆にしてはいけませんか? – phant0m

2

はちょうどこの操作を行います:

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

これは、最も効率的な方法である:

x = [i for i, in x] 

または、同等

x = [i for (i,) in x] 

これは少し遅いです:

x = [i[0] for i in x] 
+0

あなたは効率の違いについて確かですか? 3.3.0の1M要素の 'list 'を使った簡単なテストでは、それぞれ4.15msと4.14msかかりました。リストを繰り返して新しいリストを作成するのに費やされた時間は4ms以上でした。はるかに速くなる可能性が高い。 xをgenexpに変更し、2つのlistcompsをgenquepに置き換えて 'deque(genexp、maxlen = 0)'にすると、私は1.36us対1.32usを得ます。 – abarnert

+0

さらに重要なことは、誰がこの2つのどちらがより効率的であるかを気にするシナリオはどのようなシナリオですか? – abarnert

+1

どこから来ても、この効率の傾向はどこにありますか?私にとっては、より多くのポイントを獲得するのは手腕のようです。 – phant0m

0

あなたは、マップ機能を使用することができます....

map(lambda y: y[0], x) 
+2

'map'を使うつもりならば、' lambda'の代わりに 'itemgetter'を使うかもしれません。 – abarnert

11

あなたは「最高の」とは何を意味するのかは言わなかったが、おそらくあなたは「最も無色の」または「最も読みやすい」かそのようなものを意味する。

F3AR3DLEGENDによって与えられたリストの理解はおそらく最も簡単です。リスト内包表記を読む方法を知っている人は、それが何を意味するのかを直ちに知るでしょう。

y = [i[0] for i in x] 

しかし、多くの場合、リストを必要としないことがよくあります。リストを一度に繰り返すことができます。 xに十億個の要素がある場合は、十億個の要素を構築して一度に1つの要素を反復することは悪い考えかもしれません。だから、あなたはジェネレータ式を使用することができます。

y = (i[0] for i in x) 

あなたは関数型プログラミングを好む場合は、mapを使用することを好むかもしれません。

のPython 3では
y = map(operator.itemgetter(0), x) 

、これは発電機と同等です:mapの欠点は、あなたがそれをあなたがlambda機能、またはitemgetterを使用する必要があるのいずれかを意味機能だけではなく、式を、合格しなければならないということです発現; listが必要な場合はlistに渡します。 Python 2では、listを返します。イテレータを使用する場合は、mapの代わりにitertools.imapを使用します。

より一般的な平坦化ソリューションが必要な場合は、自分で作成することもできますが、この種の汎用ソリューションの場合は常にitertoolsを探してみる価値があります。実際にはflattenというレシピがあります。ネスティング "。だから、コピーしてあなたのコード(またはpip install more-itertools)にそれを貼り付け、あなただけ行うことができますこの:

y = flatten(x) 

あなたはその後、chainがどのようにして、そして、chain.from_iterableが実装されている方法でflattenが実装されているかを見れば実装されていれば、組み込み関数に関しても同じことを書くことができます。しかし、なぜflattenがもっと読みやすく分かりやすくなるのでしょうか?最後に

、あなたは(もちろん、またはジェネレータ式)ネストされたリストの内包表記にジェネリック版を減らしたい場合:

y = [j for i in x for j in i] 

ただし、ネストされたリストの内包表記は、両方の書面で、誤解するのは非常に簡単です読書。 (F3AR3DLEGENDは、最初に一番簡単な答えを出した人と同じ人で、ネストされた理解度を与えて間違ってしまったのですが、もしそれを取り除けなければ、試してみませんか?)本当に単純なケースでは、あまりにも悪くはないが、まだ、私はflattenははるかに読みやすくすると思います。

+0

パターンマッチングを解くタプルについてあなたの意見は何ですか? –

+0

@PavelAnossov:どうですか?タプルを個別の名前付き変数に展開する場合は、明らかに正しいことです。単一の値に変換したいタプルがあるときは、それほど明確ではないように見えますが、実際には好ましくありません。 – abarnert

関連する問題