2012-06-21 100 views
3

例如一個名單,我有兩個相同長度的列表:如何篩選基於另一個列表中的值

a = [[1,2],[2,2],[3,3],[4,2],[5,6]] 
b = [1,2,2,3,1] 

我想有一個函數,使得

func(a,b,1) = [[1,2],[5,6]] 
func(a,b,2) = [[2,2],[3,3]] 
func(b,b,2) = [2,2] 

什麼功能does返回a元素的列表,其列表b中的相同索引的對應元素等於第三個參數。

在Matlab中,我會做一些像a(b == 1),a(b == 2),b(b == 2)一樣簡單的事情。在Python中實現這一點的最有效方法是什麼?

+4

這是不是很清楚你想要這個功能/過濾器做什麼 –

+0

實際上解釋你想要什麼,而不是指望我們從輸入/輸出推斷,那將是有益的。另外,你有什麼嘗試? SO不是一個爲你寫代碼的地方。 –

+2

啊我明白了,它是:返回第二個參數中元素位置上的第一個參數中的值,它們與第三個參數相等。 –

回答

9

,你可以使用numpy的:

>>> import numpy 
>>> a = [[1,2],[2,2],[3,3],[4,2],[5,6]] 
>>> b = [1,2,2,3,1] 
>>> a = numpy.array(a) 
>>> b = numpy.array(b) 
>>> a[b==1] 
array([[1, 2], 
     [5, 6]]) 
>>> a[b==2] 
array([[2, 2], 
     [3, 3]]) 
>>> b[b==2] 
array([2, 2]) 

做不到這一點,我可能會簡單地用一個列表理解:

>>> [i for i,j in zip(a,b) if j == 1] 
[[1, 2], [5, 6]] 
>>> [i for i,j in zip(a,b) if j == 2] 
[[2, 2], [3, 3]] 
>>> [i for i,j in zip(b,b) if j == 2] 
[2, 2] 

這將會是微不足道的一個函數來包裝這個:

>>> def func(a,b,x): 
...  return [i for i,j in zip(a,b) if j == x] 
... 
>>> func(a,b,2) 
[[2, 2], [3, 3]] 
>>> 
4

這首先要找出其中b等於目標值([i for i, x in enumerate(b) if x==c])的索引,然後使用這些索引,讓你想出來的a的元素:如果你想 Matlab的喜歡非常功能

def func(a,b,c): 
    return [a[j] for j in [i for i, x in enumerate(b) if x==c]] 

>>> func(a,b,1) 
[[1, 2], [5, 6]] 
>>> func(a,b,2) 
[[2, 2], [3, 3]] 
>>> func(b,b,2) 
[2, 2] 
+0

基於他所做的工作而幹得不錯 - 它充其量是神祕的。 –

+0

@Lattyware:描述可能不清楚,但我認爲Matlab代碼是。 – Junuxx

+0

真的,如果你知道Matlab;) –

6

我會用itertools.compress()連同generator expression做到這一點:

def func(a, b, c): 
    return itertools.compress(a, (x == c for x in b)) 

注意這將返回發電機。如果您需要列表,請將其包裝在list()呼叫中。

>>> import itertools 
>>> def func(a, b, c): 
...  return list(itertools.compress(a, (x == c for x in b))) 
... 
>>> a = [[1,2],[2,2],[3,3],[4,2],[5,6]] 
>>> b = [1,2,2,3,1] 
>>> func(a, b, 1) 
[[1, 2], [5, 6]] 
>>> func(a, b, 2) 
[[2, 2], [3, 3]] 
>>> func(b, b, 2) 
[2, 2] 

這也是值得注意的,這應該是很好,速度很快 - itertools被設計成一個快速的模塊。

1
def func(a,b,n): 
    return [a[i] for i,x in enumerate(b) if x==n] 

a = [[1,2],[2,2],[3,3],[4,2],[5,6]] 
b = [1,2,2,3,1] 
print(func(a,b,1)) #[[1, 2], [5, 6]] 
print(func(a,b,2)) #[[2, 2], [3, 3]] 
print(func(b,b,2)) #[2, 2] 
相關問題