我有两个清单:
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))
答案 0 :(得分:3)
您可以zip
这两个列表并检查这两个元素是app.get('/all',sendAll);
function sendAll(request,response){
response.send(words);
}
,然后再检查> 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))
,那么您也可以filter
all
{};
< 0
请注意,子列表是元组;如果您需要列表map
到>>> pairs = filter(all, zip(a, b))
>>> sub_list_a, sub_list_b = zip(*pairs)
>>> sub_list_a, sub_list_b
((5, 4), (4, 4))
:
list
当然,您也可以在一行中完成上述所有操作:
>>> sub_list_a, sub_list_b = map(list, zip(*pairs))
>>> sub_list_a, sub_list_b
([5, 4], [4, 4])
答案 1 :(得分: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]
答案 2 :(得分: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]
答案 3 :(得分: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]]