假设我有两个人员列表,persons_a 和 persons_b。我想尝试根据任意属性(例如 person.age)将列表 persons_a 中的每个人与 persons_b 中的一个人相匹配, 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)
请您参考如下方法:
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 ) )
这更像 Pythonic,也更容易阅读。 itertools 只是一种执行相同嵌套 for 循环的方法,因此它并没有提高效率,只是更易于阅读代码。
由于您必须遍历每个组合,您将无法获得比 O( n^2 ) 更好的组合,因此除非您可以将循环短路或出现通过一次贪婪算法的两个列表,然后上面和你的是最佳解决方案。如果您有半结构化数据,比如等长列表也被排序,那么您可以通过一次遍历列表来加快代码速度,但如果您没有任何像这样的结构,那么你将不得不坚持使用你的 O( n^2 ) 算法。
