0

私は2つの値を持っています:starid1、starid2、およびstarlistと呼ばれるリスト、id starid1とstarid2を含むスターリストから2つのオブジェクトをピックアップしたいのですが、リストに重複したidはありません。

これが私がコードを書く方法です

star1,star2=None,None
for x in starlist:
    if x.id == starid1:
        star1 = x
    elif x.id == starid2:
        star2 = x

これが別の方法です

star1 = [x for x in starlist if x.id==starid1][0]
star2 = [x for x in starlist if x.id==starid2][0]

または、辞書に変換して2つのオブジェクトを選択することもできますが、2つの値のみを割り当てたいので、コストが高すぎると思いました。

私がそれらのコードを書き留めたとき、私はとても愚かでした。私はちょうどPythonでそれを行うための適切な方法を逃したと思います。あなたがそれをより良くするためにどのように知っているか教えてください。

4

1 に答える 1

3

一般的な方法は、ジェネレーターを使用することです。

star1 = next(x for x in starlist if x.id==starid1)
star2 = next(x for x in starlist if x.id==starid2)

これには、怠惰であるため、メモリを節約し、早期に停止するという利点があります。breakあなたの例では、これは基本的にステートメントが追加された最初のループと同じです。

star1,star2=None,None

for x in starlist:
    if x.id == starid1:
       star1 = x
       break

for x in starlist:
    if x.id == starid2:
       star2 = x
       break

ただし、nextリストにそのような項目がない場合は例外が発生することに注意してください。これを回避したい場合は、呼び出しにデフォルト値を追加します。

star1 = next((x for x in starlist if x.id==starid1), None)
于 2013-01-23T11:55:08.940 に答える