假设我有两个列表,并且从这两个列表中我想创建第三个列表,其中包含第一个列表中的元素元组。本质上我的代码如下:
a = [3,6,7,8,12,89,289]
b = [28,91,2489]
_max = 39
c = []
如果列表a
中的元素小于列表b
和列表{{1}中的元素,我希望遍历列表以便 }项目 - 列出b
的项目< = a
,然后我会将元组追加到列表_max
。
在python中执行此操作的最佳方法是什么?我一直在研究c
函数和类似的函数,但没有看到它的类似用途来完成我想要做的事情。
答案 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]