2012-08-29 52 views
1

可能重複:
python equivalent of filter() getting two output lists (i.e. partition of a list)分區陣列基於謂詞

我有在python陣列,並希望將其分割成兩個陣列,一個其中元素的謂詞匹配另一個元素沒有。

是否有一個更簡單的方法(或更Python)比下面

>>> 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]) 
+0

呵呵,我試圖與發帖無法找到它之前搜索 - 謝謝! –

回答

1
def partition(a,pred): 
    f1 = set(filter(pred,a)) 
    f2 = set(a) - f1 
    return f1,f2 

更Python ...但不知道它的速度更快

[編輯]我不認爲訂單被保留...(並且在有鏈接的評論中有更好的答案)

0

你有訪問NumPy嗎? Numpy的索引容量使得根據某些條件很容易選擇numpy ndarray的條目。例如

>>> 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對大型數組尤其有效。對於小孩來說,不是那麼多。

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) 
+1

信貸到期時給予貸款。 http://docs.python.org/dev/library/itertools.html#itertools-recipes – kojiro

2

你現在擁有的是比其他任何方式更簡單,更有效率。

這裏是你如何可以重寫此代碼的幾個可能的選擇,爲什麼我覺得你的版本更好:

  • 使用套 - 不保留順序,只適用於哈希的內容
  • 使用三通/過濾/ ifilterfalse - 取決於你如何使用的結果,你最終會使用更多的內存,並迭代兩次
  • 使用numpy的 - 並不適用於一般的iterables,需要遍歷TWIC E要得到的結果這兩種情況
-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]) 
1

又一個說同樣的事情的方式。請注意,這兩個列表的順序是相反的。

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

如果您需要的「插件」是第一則只需添加一個not

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