如何根据任意标准对齐两个列表?

AME*_*AME 1 python

假设我有两个人名单,persons_a并且persons_b.我想尝试给每个人在列表匹配persons_a一个人在persons_b根据任意属性,例如person.age,person.town_from左右.

我怎么能以最有效的方式在Python中做到这一点?我只是做一个for循环吗?

criteria = lambda a, b: a.age == b.age

result = []
for a in persons_a:
    for b in persons_b:
        if critera(a, b):
           result.add(a)
Run Code Online (Sandbox Code Playgroud)

sea*_*ean 5

criteria = lambda a, b: a.age == b.age
cross = itertools.product( persons_a, persons_b )
result = ( a for a, b in cross if criteria( a, b ) )
Run Code Online (Sandbox Code Playgroud)

这更像Pythonic,更容易阅读.这itertools只是一种为循环执行相同嵌套的方法,因此它不再更有效,只是更容易阅读代码.

由于你必须循环遍历每个组合,你将无法比你拥有的更好O( n^2 ),所以除非你可以短路循环或者通过两个列表单个传递贪婪算法,然后上面和你的是最佳解决方案.如果你有半结构化数据,那就是说等长列表也是排序的,那么你可以通过一次通过列表来加速你的代码,但如果你没有任何像这样的结构那么你将不得不坚持你的O( n^2 )算法.