2017-03-02 40 views
-6

为零我有两个列表:Python的 - 比较两个列表,并返回值超过同时存在于两个列表

a= [4,5,4,0,1,0] 
b= [0,4,4,0,0,0] 

我能在自己的子列表具有值大于零基于两个指标名单。例如,

sub_list_a =[5,4] 
sub_list_b = [4,4] 

以下代码会生成子列表。我不知道是否有一个优雅的方式来做到这一点..

idxa = [i for i, e in enumerate(a) if e != 0] 
idxb = [i for i, e in enumerate(b) if e != 0] 

inter = list(set(idxa) & set(idxb)) 
from operator import itemgetter 
print ('sub_list_a',itemgetter(*inter)(a)) 
print ('sub_list_a',itemgetter(*inter)(b)) 
+2

不明确。为什么'sub_list_b'' [4,5]'? '5'从哪里来? –

+0

你不清楚你在问什么,你能更具体吗? –

+0

当然,第一个列表应该有1个,第二个4?你有什么尝试? – Sayse

回答

3

可以zip两个列表,并再次检查这两个元素是否> 0,然后zip到对分配到两个子列表

>>> a= [4, 5, 4, 0, 1, 0] 
>>> b= [0, 4, 4, 0, 0, 0] 
>>> pairs = [(x, y) for (x, y) in zip(a, b) if x > 0 and y > 0] 
>>> sub_list_a, sub_list_b = zip(*pairs) 
>>> sub_list_a, sub_list_b 
((5, 4), (4, 4)) 

如果数字不能< 0,那么你也可以直接通过filterall

>>> pairs = filter(all, zip(a, b)) 
>>> sub_list_a, sub_list_b = zip(*pairs) 
>>> sub_list_a, sub_list_b 
((5, 4), (4, 4)) 

请注意,子列表是元组;如果你需要列出,maplist

>>> sub_list_a, sub_list_b = map(list, zip(*pairs)) 
>>> sub_list_a, sub_list_b 
([5, 4], [4, 4]) 

当然,你也可以做到以上的单行:

sub_list_a, sub_list_b = map(list, zip(*filter(all, zip(a, b)))) 
0

随着列表理解:

>>> sub_a = [a[i] for i in range(0, len(a)) if a[i] > 0 and b[i] > 0] 

>>> sub_b = [b[i] for i in range(0, len(b)) if a[i] > 0 and b[i] > 0] 

>>> sub_a 
[5, 4] 

>>> sub_b 
[4, 4] 
0

假设列表的长度相同,如果您更熟悉for循环:

a = [4,5,4,0,1,0] 
b = [0,4,4,0,0,0] 

def sub_list(l_1, l_2): 
    sublist = [] 
    for idx, val in enumerate(l_1): 
    if val > 0 and l_2[idx] !=0: 
     sublist.append(val) 
    return sublist 

print(sub_list(a,b)) #[5, 4] 
print(sub_list(b,a)) #[4, 4] 
0
import numpy 

a= [4,5,4,0,1,0] 
b= [0,4,4,0,0,0] 
# get all nonzeros index 
sub_a = numpy.nonzero(a)[0] # [0 1 2 4] 
sub_b = numpy.nonzero(b)[0] # [1,2] 
# find intersection 
intersect = numpy.intersect1d(sub_a, sub_b) # [1,2] 
# a and b index, based on intersection 
result = [[a[o], b[o]] for o in intersect] 
print (result) 

[[5, 4], [4, 4]]