迭代两个列表以进行过滤

4

我有2个列表,我正在尝试根据第一个列表中的条件过滤第二个列表。

list1 = [ {'type': 'A', 'name': '1'},{'type': 'B', 'name': '2'},{'type': 'A', 'name': '3'}]
list2 = [100, 200, 300]

filtered_list1 = list(filter(lambda x: (x['type'] == 'A'), list1))
filtered_list2 = list(filter(lambda x: ??????????????????, list2))

# expected output
# filtered_list1 = [ {'type': 'A', 'name': '1'},{'type': 'A', 'name': '3'}]
# filtered_list2 = [100, 300]

我需要根据list1中的条件筛选出list2中的元素。我该如何迭代两个列表?或者是否可以在filter/lambda中使用索引?

4个回答

6

使用zip来访问相应的列表元素对。然后在条件列表推导式中解压缩已经合并的元素,完成操作:

filtered_list2 = [ y for (x, y) in zip(list1, list2) if x["type"] == "A" ]

3
您可以使用zip函数同时迭代两个列表。
>>> list1 = [ {'type': 'A', 'name': '1'},{'type': 'B', 'name': '2'},{'type': 'A', 'name': '3'}]
>>> list2 = [100, 200, 300]
>>>
>>> fil1, fil2 = zip(*((e1, e2) for e1, e2 in zip(list1, list2) if e1['type']=='A'))
>>> 
>>> list(fil1)
[{'type': 'A', 'name': '1'}, {'type': 'A', 'name': '3'}]
>>> list(fil2)
[100, 300]

2

下面是一种使用列表推导式和enumerate的方法,根据条件保留两个列表中的值。您可以进一步使用zip将结果合并,并分别保留两个过滤后的列表,这样只需要一个列表推导式即可:


out = ((list1[i], list2[i]) for i, d in enumerate(list1) if d['type'] == 'A')
filtered_list1, filtered_list2 = list(zip(*out))

print(filtered_list1)
# ({'type': 'A', 'name': '1'}, {'type': 'A', 'name': '3'})

print(filtered_list2)
# (100, 300)

0
尝试使用列表推导式:
list1 = [ {'type': 'A', 'name': '1'},{'type': 'B', 'name': '2'},{'type': 'A', 'name': '3'}]
list2 = [100, 200, 300]

filtered_list1 = list(filter(lambda x: (x['type'] == 'A'), list1))
filtered_list2 = list(filter(lambda x: x in [int(l.get('name'))*100 for l in 
filtered_list1], list2))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接