96
foo = [x for x in bar if x.occupants > 1]

ここでグーグルで検索した後、これが何をするのかわかりませんでした。たぶん私は正しいものを探していませんでしたが、ここにあります。この省略形を暴くための入力は大歓迎です。

4

5 に答える 5

110

現在の回答は優れていますが、私たちが慣れ親しんでいるパターンに対する構文糖衣にすぎないことについては話さないでください。

例から始めましょう。10 個の数値があり、5 より大きい数値のサブセットが必要であるとします。

>>> numbers = [12, 34, 1, 4, 4, 67, 37, 9, 0, 81]

上記のタスクの場合、以下のアプローチは互いに完全に同一であり、最も冗長なものから簡潔で読みやすく、pythonicに移行します。

アプローチ1

result = []
for index in range(len(numbers)):
    if numbers[index] > 5:
        result.append(numbers[index])
print result  #Prints [12, 34, 67, 37, 9, 81]

アプローチ 2 (ややクリーンな for-in ループ)

result = []
for number in numbers:
    if number > 5:
        result.append(number)
print result  #Prints [12, 34, 67, 37, 9, 81]

アプローチ 3 (リスト内包表記を入力)

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
于 2016-06-16T21:34:22.690 に答える
26

リスト内包です

foobar属性occupants>1のオブジェクトを含むフィルタリングされたリストになります

barlist、、、またはその他の反復可能なもの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)]
于 2011-06-25T02:05:09.913 に答える
1

これにより、占有者が1より大きいバー内のすべての要素を含むリストが返されます。

于 2011-06-25T02:02:15.463 に答える
1

私が知る限り、これが機能する方法は、リスト「バー」が空 (0) であるか、x.occupants を介してシングルトン (1) で構成されているかを確認することです。ここで、x はリストバー内で定義された項目であり、入居者の特徴かもしれません。したがって、foo が呼び出され、リストを移動してから、x.occupant であるチェック条件に合格するすべての項目を返します。

Java のような言語では、「x」という名前のクラスを作成し、「x」オブジェクトを配列などに割り当てます。X には「占有者」と呼ばれるフィールドがあり、各インデックスは占有者に割り当てられた番号を返す x.occupants メソッドでチェックされます。そのメソッドが 1 より大きい値を返した場合 (ここでは、部分的な占有が奇数であるため、int を想定しています。) foo メソッド (問題の配列または同様のもので呼び出されます) は、foo メソッドで定義されている配列または同様のものを返します。このコンテナ配列またはあなたが持っているもの。返される配列の要素は、「1 より大きい」という基準に適合する最初の配列の「x」オブジェクトになります。

Python には、リスト内包表記を介した組み込みメソッドがあり、これをはるかに簡潔かつ大幅に単純化した方法で処理します。2 つの完全なクラスといくつかのメソッドを実装するのではなく、その 1 行のコードを記述します。

于 2011-06-25T02:14:56.293 に答える