1

重複の可能性:
2 つの出力リスト (つまり、リストのパーティション) を取得する filter() に相当する python

Python に配列があり、要素が述語に一致する配列と要素が一致しない配列の 2 つの配列に分割したいと考えています。

次よりも簡単な(またはよりPythonicな)方法はありますか:

>>> def partition(a, pred):
...   ain = []
...   aout = []
...   for x in a:
...     if pred(x):
...       ain.append(x)
...     else:
...       aout.append(x)
...   return (ain, aout)
...
>>> partition(range(1,10), lambda x: x%3 == 1)
([1, 4, 7], [2, 3, 5, 6, 8, 9])
4

6 に答える 6

2

あなたが現在持っているものは、これを行う他のどの方法よりも簡単で効率的です.

このコードをどのように書き換えるか、およびあなたのバージョンの方が優れていると私が考える理由について、いくつかの潜在的なオプションを次に示します。

  • セットの使用 -順序は保持されず、ハッシュ可能なコンテンツでのみ機能します
  • tee/filter/ifilterfalse の使用 -結果の使用方法によっては、より多くのメモリを使用し、2 回反復することになります
  • numpy の使用 -一般的な iterables には適用されません。両方の条件の結果を得るには 2 回反復する必要があります
于 2012-08-30T00:13:20.640 に答える
1
def partition(a,pred):
  f1 = set(filter(pred,a))
  f2 = set(a) - f1
  return f1,f2

もっとpythonic ...しかし、それが速いかどうかはわかりません

[編集]そして、順序が保持されているとは思いません...(リンク付きの両方のコメントに、より良い回答があります)

于 2012-08-30T00:05:38.133 に答える
1

同じことの別の言い方です。2 つのリストの順序が逆になっていることに注意してください。

def partition(a, pred):
    aout_ain = [], []
    for x in a:
        aout_ain[pred(x)].append(x)
    return aout_ain

「ins」を最初にする必要がある場合は、単に追加しますnot

def partition(a, pred):
    ain_aout = [], []
    for x in a:
        ain_aout[not pred(x)].append(x)
    return ain_aout
于 2012-08-30T00:42:23.923 に答える
0

NumPy にアクセスできますか? Numpy のインデックス作成機能により、ndarray条件に応じて numpy のエントリを簡単に選択できます。例えば

>>> import numpy as np
>>> a = np.arange(1, 10)
>>> condition = (a % 3 == 1)
>>> a[condition]
array([1, 4, 7])
>>> a[~condition]
array([2, 3, 5, 6, 8, 9])

NumPy は、大きな配列で特に効率的です。小さなものには、それほど多くはありません。

于 2012-08-30T00:06:32.770 に答える
0
#from http://docs.python.org/dev/library/itertools.html#itertools-recipes

def partition(pred, iterable):
    'Use a predicate to partition entries into false entries and true entries'
    # partition(is_odd, range(10)) --> 0 2 4 6 8   and  1 3 5 7 9
    t1, t2 = tee(iterable)
    return ifilterfalse(pred, t1), filter(pred, t2)
于 2012-08-30T00:07:43.250 に答える
-1

そうPythonicではありませんが、少し機能的です:

>>> partition = lambda xs, p: reduce(lambda (a, b), c: p(c) and (a + [c], b) or (a, b + [c]), xs, ([], []))
>>> print partition(range(1, 10), lambda x: x % 3 == 1)
([1, 4, 7], [2, 3, 5, 6, 8, 9])
于 2012-08-30T00:23:13.380 に答える