如何在python的两个列表中寻找方程的解?

时间:2014-01-21 02:49:01

标签: python list compare equation

对于这个问题的含糊不清感到抱歉,但我想知道,我如何比较两组数字,看看哪些数字满足等式?例如:

a = [1,2,3,4,5,6]
b = [7,8,9,10,11,12]

我需要查看两个列表的内容,然后看哪些列表满足像a + b = 12这样的等式。它需要返回满足方程的所有数字对。

编辑:我希望它能比较两个列表的每个组合!遗憾!

4 个答案:

答案 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

* 分析绩效*

  1. zip解决方案不适合,因为它无法满足所有数据组合
  2. product解决方案很合适,但您需要评估所有a * b数据集