4

実行したいクエリのタイプを擬似コードで記述します。

select blob from blobs where blob['color'] == 'red' having maximum(blob['size'])

明らかに、Python で次のように書くことができます。

redBlobs = [];

for blob in blobs:
    if blob['color'] == 'red':
        redBlobs.append('blob')

largestBlob = None

for redBlob in redBlobs:
    if largestBlob == None or redBlob['size'] > largestBlob['size']:
        largestBlob = redBlob

return largestBlob

しかし、私はそれを行うよりクリーンな方法があると思います。私はPythonに慣れていないので、まだ非常に命令的に近づいています。

編集:

SOに関する他のいくつかの質問を見て、私が思いついた解決策は次のとおりです。

max([blob for blob in blobs if blob['color'] == 'red'], key = lambda b: b['size'])

おそらく、もっと良い方法があります。

4

4 に答える 4

10

以下は最大のブロブを与える

編集:赤いブロブがないときに例外をキャッチする

import operator
try:
    largestBlob = max((blob for blob in blobs if blob['color'] == 'red'),key=operator.itemgetter('size'))
except ValueError:
    largestBlob = None
于 2011-04-01T14:54:25.690 に答える
1

これは仕事をします:

redBlobs = filter(lambda b: b['color'] == 'red', blobs)
largestBlob = max(redBlobs, key=lambda b: b['size'])
于 2011-04-01T14:47:59.677 に答える
1

PiotrLegnica の回答は、最大のブロブ自体ではなく、最大のブロブのサイズを返します。最大のブロブを取得するには、オプションの "key" 引数を max に使用します。

largestBlob = max((blob for blob in blobs if blob['color'] == 'red'), key=operator.itemgetter('size'))
于 2011-04-01T14:48:30.123 に答える
0

もし私があなただったら、ファイルテリング用のジェネレーター式でキーとしてサイズを使用して sorted を使用し、そのリストの最初の要素を取得します。

largestBlob = sorted((blob for blob in blobs if blob['color'] == 'red'), key=lambda x: -x['size'])[0]
于 2011-04-01T14:50:25.317 に答える