我如何在Python的两个列表中寻找方程式的解决方案



对此问题的模糊性感到抱歉,但是我想知道,如何比较两组数字,看看哪些数字满足方程式?例如:

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

我需要一些看两个列表的东西,然后看到哪个列表满足了诸如a + b = 12之类的方程式。它需要返回满足方程式的所有数字对。

编辑:我希望它比较两个列表的每个组合!抱歉!

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,以了解是否值得额外的代码行)。

使用 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

这很微不足道,对列表理解是微不足道的,实际上在列表中涵盖了在两个列表上迭代的理解示例。

首先,您需要在每个列表上迭代:

[(x,y) for x in a for y in b]

这给出了用ba元素排序的每个列表的每一对(注意下面的元素的顺序)。

[(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)]

这可以作为生成器创建,当根据需要创建元素时,而不是创建和存储整个列表,如果ab很大。

喜欢这样(请注意圆括号而不是方括号):

>>> ((x,y) for x in a for y in b)
<generator object <genexpr> at 0x7f12e1bfef00>

如果有两组数字

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)的解决方案是否位于列表中(SET)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数据集

最新更新