foo = [x for x in bar if x.occupants > 1]
ここでグーグルで検索した後、これが何をするのかわかりませんでした。たぶん私は正しいものを探していませんでしたが、ここにあります。この省略形を暴くための入力は大歓迎です。
foo = [x for x in bar if x.occupants > 1]
ここでグーグルで検索した後、これが何をするのかわかりませんでした。たぶん私は正しいものを探していませんでしたが、ここにあります。この省略形を暴くための入力は大歓迎です。
現在の回答は優れていますが、私たちが慣れ親しんでいるパターンに対する構文糖衣にすぎないことについては話さないでください。
例から始めましょう。10 個の数値があり、5 より大きい数値のサブセットが必要であるとします。
>>> numbers = [12, 34, 1, 4, 4, 67, 37, 9, 0, 81]
上記のタスクの場合、以下のアプローチは互いに完全に同一であり、最も冗長なものから簡潔で読みやすく、pythonicに移行します。
result = []
for index in range(len(numbers)):
if numbers[index] > 5:
result.append(numbers[index])
print result #Prints [12, 34, 67, 37, 9, 81]
result = []
for number in numbers:
if number > 5:
result.append(number)
print result #Prints [12, 34, 67, 37, 9, 81]
result = [number for number in numbers if number > 5]
[function(number) for number in numbers if condition(number)]
どこ:
function(x)
を取り、x
それを何か便利なものに変換します (例: x*x
)condition(x)
False-y 値 (False、None、空の文字列、空のリストなど) を返す場合、現在の反復はスキップされます (考えてくださいcontinue
)。関数が False-y 以外の値を返す場合、現在の値が最終的な結果の配列になります (そして、上記の変換手順を実行します)。少し異なる方法で構文を理解するには、以下のボーナス セクションを参照してください。
詳細については、他のすべての回答がリンクされているチュートリアルに従ってください: List Comprehension
(少しPythonicではありませんが、完全を期すためにここに入れます)
上記の例は、次のように記述できます。
result = filter(lambda x: x > 5, numbers)
上記の一般式は、次のように記述できます。
result = map(function, filter(condition, numbers)) #result is a list in Py2
リスト内包です
foo
bar
属性occupants>1のオブジェクトを含むフィルタリングされたリストになります
bar
list
、、、またはその他の反復可能なものset
にすることができますdict
これは明確にするための例です
>>> class Bar(object):
... def __init__(self, occupants):
... self.occupants = occupants
...
>>> bar=[Bar(0), Bar(1), Bar(2), Bar(3)]
>>> foo = [x for x in bar if x.occupants > 1]
>>> foo
[<__main__.Bar object at 0xb748516c>, <__main__.Bar object at 0xb748518c>]
したがって、fooには2つBar
のオブジェクトがありますが、どのオブジェクトであるかをどのように確認しますか?より有益な__repr__
方法を追加しましょうBar
>>> Bar.__repr__=lambda self:"Bar(occupants={0})".format(self.occupants)
>>> foo
[Bar(occupants=2), Bar(occupants=3)]
これにより、占有者が1より大きいバー内のすべての要素を含むリストが返されます。
私が知る限り、これが機能する方法は、リスト「バー」が空 (0) であるか、x.occupants を介してシングルトン (1) で構成されているかを確認することです。ここで、x はリストバー内で定義された項目であり、入居者の特徴かもしれません。したがって、foo が呼び出され、リストを移動してから、x.occupant であるチェック条件に合格するすべての項目を返します。
Java のような言語では、「x」という名前のクラスを作成し、「x」オブジェクトを配列などに割り当てます。X には「占有者」と呼ばれるフィールドがあり、各インデックスは占有者に割り当てられた番号を返す x.occupants メソッドでチェックされます。そのメソッドが 1 より大きい値を返した場合 (ここでは、部分的な占有が奇数であるため、int を想定しています。) foo メソッド (問題の配列または同様のもので呼び出されます) は、foo メソッドで定義されている配列または同様のものを返します。このコンテナ配列またはあなたが持っているもの。返される配列の要素は、「1 より大きい」という基準に適合する最初の配列の「x」オブジェクトになります。
Python には、リスト内包表記を介した組み込みメソッドがあり、これをはるかに簡潔かつ大幅に単純化した方法で処理します。2 つの完全なクラスといくつかのメソッドを実装するのではなく、その 1 行のコードを記述します。