对于两个列表,l1和l2,如何检查所有e1∈l1,∃p(e1,e2)其中e2是l2中的某个元素,有效地在python中?

时间:2016-08-05 15:35:44

标签: python algorithm list iterator traversal

好的,不确定这是不是最好的标题,但我有两个python列表。 L1和L2都具有T型元素并且长度不同。

我有一个函数p(T,T),它是一个谓词,检查有关T类型的两个元素的属性。

我想检查对于L1中的所有元素e,p(e,e')成立,其中e'是L2中的某个元素。所以基本上对于L1中的每个元素,我都会遍历第二个列表,并检查谓词是否适用于任何元素。但我也想检查另一个列表的相同内容。

p(T,T)是对称的。所以如果p(e,e')则p(e',e)。由于这种对称性,我不想两次做同样的事情。我需要以某种方式记录,如果我看到p(e,e'),那么我知道p(e',e)而不必再次检查第二个列表。

在python中执行此操作的最佳方法是什么?我想为每个列表中的每个元素e1设置另一个字段,告诉我们p(e1,e2)是否成立,其中e2是另一个列表的成员。但我认为这需要复制这两个列表,所以我不会改变它们。有没有好办法呢?

2 个答案:

答案 0 :(得分:2)

object对称的事实基本上是无用的。确实如果你知道p成立,你知道p(e, e')成立,但除非p(e', e)e都在两个列表中,否则你只能使用你的谓词评估一次而不是两次。即使列表可能存在大量重叠,重复e'评估仍然比尝试利用对称性更有效。

执行所需检查的最佳方式可能是重新组织数据并利用p的某些进一步结构来找到更有效的算法,但是根据我们拥有的信息,我们可以'帮助你。我能说的最好的就是蛮力:

e

答案 1 :(得分:0)

我只想为每个列表创建一个字典(可以是dict1dict2),当您遍历第一个列表时,同时设置dict1[e] = e'和{{1} }。然后,在迭代dict2[e'] = e时,您只需检查当前L2是否在e中。如果存在重复的dict2值,也可以将此检查添加到L1的第一次迭代中。希望这是有道理的 - 在我的手机上写下这个。