2016-01-17 1 views

答えて

63

From the documentation:

リストの内包表記はリストを作成するための簡潔な方法を提供します。一般的なアプリケーションは、各要素が別のシーケンスまたは反復可能要素の各メンバーに適用された操作の結果であるか、または特定の条件を満たす要素の部分列を作成する新しいリストを作成することです。あなたの質問について


、リスト内包は、以下の「プレーン」、Pythonのコードと同じものではない:

>>> l = [] 
>>> for x in range(10): 
...  l.append(x**2) 
>>> l 
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81] 

は、どのようにそれは1行で書くのですか?ただ、リストの内包表記を使用する

>>> list(map(lambda x: x**2, range(10))) 
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81] 

しかし、それは明確かつ単純ではありません:うーん...我々は...たぶん... lambdamap()を使用することができますか?

>>> [x**2 for x in range(10)] 
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81] 

基本的に、我々はxで何かを行うことができます。だけでなく、x**2

>>> [x.strip() for x in ('foo\n', 'bar\n', 'baz\n')] 
['foo', 'bar', 'baz'] 

か、別の関数の引数としてxを使用します:たとえば、xの方法を実行し

>>> [int(x) for x in ('1', '2', '3')] 
[1, 2, 3] 

我々はまた、例えば、dictオブジェクトのキーとしてxを使用することができます。見てみましょう:

>>> d = {'foo': '10', 'bar': '20', 'baz': '30'} 
>>> [d[x] for x in ['foo', 'baz']] 
['10', '30'] 

どのような組み合わせですか?

>>> d = {'foo': '10', 'bar': '20', 'baz': '30'} 
>>> [int(d[x].rstrip('0')) for x in ['foo', 'baz']] 
[1, 3] 

など。


また、リスト内包でifまたはif...elseを使用することができます。たとえば、奇数のみをrange(10)に入れたいとします。あなたはできる:

>>> l = [] 
>>> for x in range(10): 
...  if x%2: 
...   l.append(x) 
>>> l 
[1, 3, 5, 7, 9] 

あああまりにも複雑です。次のバージョンはどうですか?range(10)

>>> [x for x in range(10) if x%2] 
[1, 3, 5, 7, 9] 

if...else三元表現を使用するには、あなたがxif ... else ...を置く必要がある、ない

>>> [i if i%2 != 0 else None for i in range(10)] 
[None, 1, None, 3, None, 5, None, 7, None, 9] 

はあなたがについてnested list comprehensionを聞いたことがありますか? を2つ以上forを1つのリストの理解に入れることができます。たとえば:

>>> [i for x in [[1, 2, 3], [4, 5, 6]] for i in x] 
[1, 2, 3, 4, 5, 6] 

>>> [j for x in [[[1, 2], [3]], [[4, 5], [6]]] for i in x for j in i] 
[1, 2, 3, 4, 5, 6] 

はのは[1, 2, 3][4, 5, 6]を与える最初の部分、for x in [[1, 2, 3], [4, 5, 6]]についてお話しましょう。そして、for i in xは、1,2,3,4,5,6となる。

警告:あなたはいつもfor x in [[1, 2, 3], [4, 5, 6]]for i in xの前に置く必要があります。我々はまた、セット内包dictの内包表記を持って

>>> [j for j in x for x in [[1, 2, 3], [4, 5, 6]]] 
Traceback (most recent call last): 
    File "<input>", line 1, in <module> 
NameError: name 'x' is not defined 

、および発電機がを表現。

セット内包とリストの内包表記は基本的に同じであるが、前者戻っはなくリストを設定します。

>>> set([i for i in [1, 1, 2, 3, 3, 1]]) 
{1, 2, 3} 

>>> {x for x in [1, 1, 2, 3, 3, 1]} 
{1, 2, 3} 

それは同じですA dict comprehensionのように設定されていますが、ではなく、または{i: i for i in ...}です。例えば

>>> {i: i**2 for i in range(5)} 
{0: 0, 1: 1, 2: 4, 3: 9, 4: 16} 

そして、それは等しい:

>>> d = {} 
>>> for i in range(5): 
...  d[i] = i**2 
>>> d 
{0: 0, 1: 1, 2: 4, 3: 9, 4: 16} 

(i for i in range(5))タプルを与えていますか?いいえ、それはgenerator expressionです。

>>> def gen(): 
...  for i in range(5): 
...   yield i 
>>> gen() 
<generator object gen at 0x7f5270380db0> 

そして、あなたは発電機としてそれを使用することができます:それは同じだ

>>> (i for i in range(5)) 
<generator object <genexpr> at 0x7f52703fbca8> 

:どちらが発電を返し

>>> gen = (i for i in range(5)) 
>>> next(gen) 
0 
>>> next(gen) 
1 
>>> list(gen) 
[2, 3, 4] 
>>> next(gen) 
Traceback (most recent call last): 
    File "<input>", line 1, in <module> 
StopIteration 

注:あなたが使用している場合リストの理解は機能の中に、あなたはは必要ありませんその関数がジェネレータをループする可能性がある場合はです。例えば、sum()

>>> sum(i**2 for i in range(5)) 
30 

関連(ジェネレータ約):Understanding Generators in Python

+0

三項式「x if cond else y」は本当にリスト内包とは何の関係もありません。有効な式はリスト内で使用できます。圧縮 - 三項式は多くのPython式の一つです。 – AChampion

+3

@AChampion:ええと、リスト内包を学んでいて、うまくいきませんでしたので、私の答えで言いました。いくつかの研究の後で、代わりに ''もし私が他の人のために '' x 'を使う必要があることを理解しています。だから私がここでそれを言及すれば、他の人が私が以前に持っていた問題を避けることができると思います。 –

+0

Python 3.xの 'list()' – styvane

7

リスト、ディクショナリ、およびセットの解説がありますが、タプルの解説はありません(ただし、「ジェネレータ式」を参照してください)。

Pythonの伝統的なループは、値を返す式ではなく、何も返しません。

これらはすべての問題の解決策ではなく、従来のループとして書き直すことができます。状態が維持される必要があるとき、それらは反復の間に更新された&が厄介になる。

彼らは通常で構成されています

[<output expr> <loop expr <input expr>> <optional predicate expr>] 

が、面白いと奇妙な方法の多くでねじれることができます。

これは、従来のmap()filter()の操作に似ていても、Pythonにはまだ存在し、引き続き使用されます。

うまくいくと、満足度が高くなります。

+2

これは私の一日を成し遂げました。「うまくいったら満足感が高い」 –

関連する問題