迭代两个列表进行过滤

时间:2019-07-24 14:35:04

标签: python list filter

我有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 个答案:

答案 0 :(得分:4)

使用zip成对访问相应的列表元素。然后,您可以在条件列表理解中解压缩这些压缩对,然后完成:

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

答案 1 :(得分: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 :(得分: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)

答案 3 :(得分: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))