2012-06-21 69 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] 
相关问题