Python比较两个列表并返回两个列表中都存在的大于零的值

2024-04-25 06:09:51 发布

您现在位置: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))

Tags: 方法in列表forif代码生成list单子
3条回答

您可以^{}这两个列表并检查这两个元素是否都是> 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,那么您也可以^{}^{}

>>> 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])

当然,您也可以在一行中完成以上所有操作:

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

列表理解:

>>> 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]

如果您更喜欢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]

相关问题 更多 >