2017-03-02 74 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]]