2

TL;DR どれが一番いいですか?

1.- [r.update(r.pop('some_key')) for r in res if r.get('some_key')]

2.- map(lambda r: r.update(r.pop('some_key') if r.get('some_key') else []), res)

3.- map(lambda r: r.update(r.pop('some_key')), filter(lambda r: r.get('some_key'), res))

4.- for r in res:
        if r.get('some_key'):
            for element in r['some_key']:
                r[element] = r['some_key'][element]
            del r['some_key']

5.- Insert your own approach here

: これは製品コードではありません。テスト スイートで実行されるコードなので、パフォーマンスよりも読みやすさ/保守性に関心があります。それにもかかわらず、これが製品コードである場合、(パフォーマンス/読みやすさのトレードオフを考慮して) どちらが優れているかに関する決定が変わるかどうかも知りたいです。これが違いを生む場合、「some_key」の要素の数は非常に少ないです。

コンテキスト: Python List Comprehension Vsを読みました。受け入れられた答えが言うところに地図:

[...] 他のケースではリスト内包表記の方が高速である可能性があり、ほとんどの (すべてではない) pythonistas はそれらをより直接的で明確であると考えています[...]。

それにもかかわらず、受け入れられた答えIs it Pythonic to use list comprehensions for just side effects? 言います:

そうすることは非常に反 Python 的です[副作用のためだけに内包リストを使用し、戻り値を無視します]。中間リストは作成後に破棄され、非常に大きくなる可能性があるため、作成にコストがかかります。

PS: どちらが最適かについては既に意見がありますが、私の同僚の 1 人は反対しています。これが私が尋ねている理由です。

4

2 に答える 2

2
1.- [r.update(r.pop('some_key')) for r in res if r.get('some_key')]

副作用のためのリスト内包表記はお勧めしません。操作の最後に破棄されるリストを作成します

2.- map(lambda r: r.update(r.pop('some_key') if r.get('some_key') else []), res)

1これは Py 3.X で壊れるということを除けば、それと大差ありません。

3.- map(lambda r: r.update(r.pop('some_key')), filter(lambda r: r.get('some_key'), res))

さらに悪いことに3map副作用を使用して依存することとは別に、関数呼び出しのオーバーヘッドを追加しています

4.- for r in res:
        if r.get('some_key'):
            for element in r['some_key']:
                r[element] = r['some_key'][element]
            del r['some_key']

これは他のものよりも優れています

  1. 破棄される不要なリストは生成されません
  2. Py 3.x で動作します
  3. 明示的な関数呼び出しのオーバーヘッドがない

5.- ここに独自のアプローチを挿入

    for r in res:
        if 'some_key' in r:
            r.update(r['some_key'])
            del r['some_key']
于 2013-01-31T19:15:08.193 に答える
2

アビジットの回答のこのバリエーションは、同時に私の 4 番目のポイントのバリエーションでもあると思います。

for r in res:
    r.update(r.pop('some_key', {}))
  • 通常のforループを使用するすべての利点があります
  • わかりやすい
  • わずか 2 行のコードで済みます
  • if節はいらない
于 2013-02-04T19:10:34.223 に答える