【发布时间】:2011-07-27 18:13:48
【问题描述】:
这是我要执行的查询类型,用伪代码编写:
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'])
想必还有更好的办法。
【问题讨论】:
-
编辑的解决方案比较好,它只有一个严重的问题(除了缺少关闭
]导致的语法错误):列表推导导致Python创建一个整体在开始评估之前所有红色 blob 对象的新列表。使用生成器表达式,它在 O(1) 空间中运行(假设max使用 O(1) 空间,这几乎可以肯定)。 -
您的解决方案几乎是完美的,除了三点:首先它缺少一个 ],其次它构建了一个对生成器无用的列表,第三您可以使用比 lambda 更快的 operator.itemgetter