好的,不确定这是不是最好的标题,但我有两个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是另一个列表的成员。但我认为这需要复制这两个列表,所以我不会改变它们。有没有好办法呢?
答案 0 :(得分:2)
object
对称的事实基本上是无用的。确实如果你知道p
成立,你知道p(e, e')
成立,但除非p(e', e)
和e
都在两个列表中,否则你只能使用你的谓词评估一次而不是两次。即使列表可能存在大量重叠,重复e'
评估仍然比尝试利用对称性更有效。
执行所需检查的最佳方式可能是重新组织数据并利用p
的某些进一步结构来找到更有效的算法,但是根据我们拥有的信息,我们可以'帮助你。我能说的最好的就是蛮力:
e
答案 1 :(得分:0)
我只想为每个列表创建一个字典(可以是dict1
和dict2
),当您遍历第一个列表时,同时设置dict1[e] = e'
和{{1} }。然后,在迭代dict2[e'] = e
时,您只需检查当前L2
是否在e
中。如果存在重复的dict2
值,也可以将此检查添加到L1
的第一次迭代中。希望这是有道理的 - 在我的手机上写下这个。