Есть ли сокращение для запроса словаря в Python? - PullRequest
4 голосов
/ 01 апреля 2011

Вот тип запроса, который я хочу выполнить, написанный в псевдокоде:

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, поэтому я все еще очень настойчиво к нему стремлюсь.

EDIT:

Вот решение, которое я нашел, посмотрев на некоторые другие вопросы по SO:

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

Предположительно, есть лучшие способы.

Ответы [ 4 ]

10 голосов
/ 01 апреля 2011

Следующие дают самый большой шарик

РЕДАКТИРОВАТЬ : поймать исключение, когда нет красной капли

import operator
try:
    largestBlob = max((blob for blob in blobs if blob['color'] == 'red'),key=operator.itemgetter('size'))
except ValueError:
    largestBlob = None
1 голос
/ 01 апреля 2011

Ответ PiotrLegnica вернет размер самого большого шарика, а не самого большого шарика.Чтобы получить самый большой BLOB-объект, используйте необязательный аргумент «ключ» для max:

largestBlob = max((blob for blob in blobs if blob['color'] == 'red'), key=operator.itemgetter('size'))
1 голос
/ 01 апреля 2011

Это сделает работу:

redBlobs = filter(lambda b: b['color'] == 'red', blobs)
largestBlob = max(redBlobs, key=lambda b: b['size'])
0 голосов
/ 01 апреля 2011

На вашем месте я бы использовал сортировку с использованием размера в качестве ключа с выражением генератора для фильтрации, получая первый элемент этого списка:

largestBlob = sorted((blob for blob in blobs if blob['color'] == 'red'), key=lambda x: -x['size'])[0]
...