对于这个问题的含糊不清感到抱歉,但我想知道,我如何比较两组数字,看看哪些数字满足等式?例如:
a = [1,2,3,4,5,6]
b = [7,8,9,10,11,12]
我需要查看两个列表的内容,然后看哪些列表满足像a + b = 12
这样的等式。它需要返回满足方程的所有数字对。
答案 0 :(得分:2)
zip
是你的朋友:
good_vals = [(aa, bb) for aa, bb in zip(a, b) if aa + bb == 12]
修改的
因为看起来你想要进行全面比较,所以你需要一个嵌套循环 - 显式或暗示。以下是一些选项:
# itertools.product
[tup for tup in it.product(a, b) if sum(tup) == 12]
# nested list-comp
[(aa, bb) for aa in a for bb in b if aa + bb == 12]
# good ole' fashioned loop:
result = []
for aa in a:
for bb in b:
if aa + bb == 12:
result.append((aa, bb))
有些人可能想知道为什么我要包括最后一个选项......实际上,它比其他两个选项更冗长,效率更高。但是,在某些情况下,您可能能够继续外循环而根本不进行内循环...例如,如果aa > 12
并且您知道由于对问题的某些限制,bb
总是正面的。如果是这种情况,那么实际上可能会从稍好的算法中获得一些性能优势(当然,正常的建议适用:timeit
使用真实数据来了解是否值得额外的代码行。)
答案 1 :(得分:1)
使用itertools.product
构建所有对,然后检查所有对
In [27]: import itertools
In [28]: for i, j in itertools.product(a, b):
....: if i+j==12: print i, j
....:
1 11
2 10
3 9
4 8
5 7
答案 2 :(得分:1)
这对于列表理解是微不足道的,并且是实践lly covered on the list comprehension examples for iterating over two lists。
首先,您需要遍历每个列表:
[(x,y) for x in a for y in b]
这为每个列表的每一对提供了由a
和[{1}}的元素排序(通知下面元素的顺序)。
b
然后在末尾应用过滤器来限制列表:
[(1, 7), (1, 8), (1, 9), (1, 10), (1, 11), (1, 12), (2, 7), (2, 8),
(2, 9), (2, 10), (2, 11), (2, 12), (3, 7), (3, 8), (3, 9), (3, 10),
(3, 11), (3, 12), (4, 7), (4, 8), (4, 9), (4, 10), (4, 11), (4, 12),
(5, 7), (5, 8), (5, 9), (5, 10), (5, 11), (5, 12), (6, 7), (6, 8),
(6, 9), (6, 10), (6, 11), (6, 12)
]
当根据需要创建元素时,可以将其创建为生成器,而不是在>>> a = [1,2,3,4,5,6]
>>> b = [7,8,9,10,11,12]
>>> [(x,y) for x in a for y in b if x+y==12]
[(1, 11), (2, 10), (3, 9), (4, 8), (5, 7)]
和a
相当大的情况下创建并将整个列表存储在内存中。
像这样(注意圆括号而不是方括号):
b
答案 3 :(得分:0)
如果您有两组数字
a = [1,2,3,4,5,6]
b = [7,8,9,10,11,12]
并且可以将隐式函数f(a,b)=0
转换为显式函数b=f(a)
将至少一个数字列表转换为集合
b = set(b)
并迭代另一组数字并确定等式f(x)
的解是否位于列表中(集合)b
for x in a:
if f(x) in b:
print x, f(x)
运行示例
>>> for x in a:
if f(x) in b:
print x, f(x)
1 11
2 10
3 9
4 8
5 7
* 分析绩效*
zip
解决方案不适合,因为它无法满足所有数据组合product
解决方案很合适,但您需要评估所有a * b
数据集