1

次のような辞書項目のリストがある場合:

L = [{"a":1, "b":0}, {"a":3, "b":1}...]

これらのエントリを「b」の値 (0 または 1) に基づいて分割したいと思います。

A(b=0) = [{"a":1, "b":1}, ....]
B(b=1) = [{"a":3, "b":2}, .....]

私は単純なリスト内包表記の使用に慣れており、現在、リスト L を 2 回ループしています。

A = [d for d in L if d["b"] == 0]
B = [d for d in L if d["b"] != 0]

明らかに、これは最も効率的な方法ではありません。

リスト内包表記機能では、else 句が使用できないようです。

リスト内包表記でやりたいことはできますか?

これを行うより良い方法はありますか?

読みやすさと効率のバランスを取り、読みやすさに傾倒しています。

ありがとう!

更新: コメントとアイデアをありがとう! 私にとって最も読みやすいのは、Thomas によるものです。しかし、アレックスの提案も見ていきます。コレクションモジュールへの参照は以前に見つかりませんでした。

4

2 に答える 2

5

リスト内包表記を使用しないでください。リスト内包表記は、単一のリスト結果が必要な場合に使用します。あなたは明らかにしません:)通常のforループを使用します:

A = []
B = []
for item in L:
    if item['b'] == 0:
        target = A
    else:
        target = B
    target.append(item)

たとえば、スニペットを短くすることはできます(A, B)[item['b'] != 0].append(item)が、わざわざする必要はありません。

于 2010-01-22T17:27:07.543 に答える
3

b値が 0 または 1 しかない場合は、@Thomas の単純なソリューションがおそらく最適です。より一般的なケース(いくつかの可能な値を区別したい場合)ではb、サンプルの「期待される結果」は、質問のテキストから完全に切り離され、矛盾しているように見えるため、実際に一般性が必要かどうかは明らかではありません。 -):

from collections import defaultdict

separated = defaultdict(list)
for x in L:
  separated[x['b']].append(x)

このコードが実行separatedされると、dict(実際には のインスタンスcollections.defaultdict、サブクラス) が生成されます。そのキーは、 list の s で実際に発生するdictすべての値であり、対応する値は分離されたサブリストです。したがって、たとえば、 ifは値のみを取り、 (例とは対照的に質問のテキストで) list として必要なものと、 listとして必要なものになります。bdictLb01separated[0]Aseparated[1]B

于 2010-01-22T18:41:02.990 に答える