7

述語によってリストを 2 つのリストに分割するより簡潔な方法はありますか?

errors, okays = [], []
for r in results:
    if success_condition(r):
        okays.append(r)
    else:
        errors.append(r)

reduceこれを;を使用して醜いワンライナーに変えることができることを理解しています。これは私が探しているものではありません。

更新:要素ごとに 1 回だけ計算するsuccess_conditionことが望ましいです。

4

5 に答える 5

6

多分

for r in results:
    (okays if success_condition(r) else errors).append(r)

しかし、それはあまりPythonicに見えません。


直接関係はありませんが、効率を求める場合は、メソッドのルックアップをキャッシュする方が良いでしょう:

okays_append = okays.append
errors_append = errors.append

for r in results:
    (okays_append if success_condition(r) else errors_append)(r)

これはPythonicではありません。

于 2012-08-15T18:37:16.237 に答える
4
errors, okays = [], []
for r in results:
    (errors, okays)[success_condition(r)].append(r)
于 2012-08-15T19:38:54.210 に答える
4

どうですか

errors = [ r for r in results if not success_condition(r)]
okays = [ r for r in results if success_condition(r)]

または

bools = [ success_condition(r) for r in results ] 

success_condition がコストのかかる呼び出しである場合は、上記を (zipまたはを介し​​て) 置き換えます。enumerate

于 2012-08-15T18:33:35.987 に答える
1

副作用のあるジェネレーター式またはリスト内包表記を使用します(簡潔に見せるためだけに):

>>> errors, okays = [], []
>>> [okays.append(r) if success_condition(r) else errors.append(r)  for r in results]

ジェネレーター式を使用:

>>> errors, okays = [], []
>>> list(okays.append(r) if success_condition(r) else errors.append(r)  for r in results)
于 2012-08-15T18:43:03.427 に答える
0

filter機能はどうですか?

okays = filter(success_condition, results)
errors = filter(lambda (x): not success_condition(x), results)
于 2012-08-15T18:36:19.667 に答える