用条件循环遍历两个列表

时间:2017-03-07 14:57:49

标签: python python-3.5

假设我有两个列表,并且从这两个列表中我想创建第三个列表,其中包含第一个列表中的元素元组。本质上我的代码如下:

a = [3,6,7,8,12,89,289] 
b = [28,91,2489]
_max = 39
c = []

如果列表a中的元素小于列表b列表{{1}中的元素,我希望遍历列表以便 }项目 - 列出b的项目< = a ,然后我会将元组追加到列表_max

在python中执行此操作的最佳方法是什么?我一直在研究c函数和类似的函数,但没有看到它的类似用途来完成我想要做的事情。

3 个答案:

答案 0 :(得分:2)

编辑:由于原始问题的措辞相当不清楚,我假设你想要将列表a的每个元素与列表b的每个元素进行比较。正如评论中指出的那样,这种组合称为笛卡儿产品。如果这样的元组符合您的条件,您想将其添加到列表c。

您可以使用带有条件的列表推导来构建列表c

a = [3,6,7,8,12,89,289] 
b = [28,91,2489]

max_value = 39

c=[(item_a, item_b) for item_a in a for item_b in b if (item_a<item_b and item_b-item_a<=max_value)]

或者,您可以使用itertools创建产品:

import itertools
# ...
c=[(item_a, item_b) for (item_a, item_b) in itertools.product(a, b) if (item_a<item_b and item_b-item_a<=max)]

另外:请不要使用内部名称(如max)作为变量名称。

答案 1 :(得分:0)

我认为你不想要zip功能;只查看其中element_a来自列表a的对(element_a,element_b),element_b来自列表b,并且两个元素在列表中都具有相同的索引

你想要的是迭代所有对(element_a,element_b),其中element_a来自列表a,element_b来自列表b。

这被称为列表a和列表b的笛卡尔积。

有一个模块(以及许多相关的迭代) - itertools。

具体你想要

from itertools import product
product(a, b)

当你迭代这个时,你应该使用一个理解,而不是通过追加来建立答案。

答案 2 :(得分:0)

itertolols.product

怎么样?
[i for i in list(itertools.product(a,b)) if abs(i[1]-i[0])<=max_value]