2011-01-24 2 views
1

У меня есть список объектов Account в self.accounts, и я знаю, что только один из них будет иметь атрибут type, равный 'equity'. Какой лучший (самый пифонический) способ получить только тот объект из списка?Получить конкретный объект из списка с определенным параметром

В настоящее время у меня есть следующее, но мне интересно, является ли [0] в конце излишним. Есть ли более сжатый способ сделать это?

return [account for account in self.accounts if account.type == 'equity'][0]

+0

«Мне интересно, если [0] в конце лишний»? Зачем удивляться? Попробуй. После того, как вы попробовали это, попробуйте другие вещи, такие как печать промежуточных результатов выражений. –

+0

Нет, это не лишнее, потому что оно определяет, вернете ли вы список (возможно, ноль или более элементов в нем) или только первый элемент в этом списке (и предположим, что он не пуст). Если это то, что вы хотите, это довольно красноречиво. – martineau

+0

То, что я имел в виду, лишним, было обертывание в списке только для того, чтобы вытащить его обратно. Как я это сделал, я знал, что это необходимо, но я искал способ пропустить этот шаг. – keithjgrant

ответ

7
return next(account for account in self.accounts if account.type == 'equity') 

или

return (account for account in self.accounts if account.type == 'equity').next() 
4

"Pythonic" ничего не значит. Вероятно, не существует более «сжатого» решения, чем у вас, нет.

Решение Ignacios имеет преимущество остановки, когда находит товар. Другим способом это будет:

def get_equity_account(self): 
    for item in self.accounts: 
     if item.type == 'equity': 
      return item 
    raise ValueError('No equity account found') 

Возможно, это более читаемо. Читаемость Pythonic. :)

Редактировать: Улучшено после предложений martineaus. Сделал его полным методом.

+0

Не должно быть 'для элемента в self.accounts:', а не 'для элемента в self.accounts [0]:', чтобы быть переводом кода OP? – martineau

+0

Я также думаю, что 'break' должен быть' return item' и что 'for' должен иметь предложение' else: 'или что-то в нем, чтобы указать 'not found'. – martineau

+0

Вы неверны в [0]. Другие предложения тоже хороши, хотя 'else' не требуется, если мы используем' return'. –

Смежные вопросы