2011-01-24 10 views
1

私はself.accountsにAccountオブジェクトのリストを持っていますが、そのうちの1つだけtype属性が 'equity'に等しいことがわかります。そのオブジェクトだけをリストから取得するには、どのような方法(最も非平凡な方法)が最適ですか?特定のパラメータを持つリストから特定のオブジェクトを取得

現在、私は以下を持っていますが、末尾の[0]が不必要であるかどうかは疑問です。これを行うためのより簡潔な方法はありますか?

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

+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

"Python的には、" 何を意味します。おそらく、あなたのものよりも "簡潔な"解決策はないでしょう。

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 [item:in item in]ではなく、 'self.accounts [0]: 'の項目でOPのコードを翻訳するのではないでしょうか? – martineau

+0

私はまた、 'break'は' return item'でなければならず、 'for'は' else: '句またはそれに続くものが 'not found'を示すべきであると考えています。 – martineau

+0

[0]が間違っているということは間違いありません。他の提案も良いですが、 'return'を使うと' else'は必要ありません。 –