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

以下给出了最大的 blob

编辑:当没有红色斑点时捕获异常

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 的答案将返回最大 blob 的大小,而不是最大 blob 本身。要获得最大的 blob,请使用 max 的可选“key”参数:

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

如果我是你,我会使用大小作为键进行排序,并使用生成器表达式进行过滤,获取该列表的第一个元素:

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