我有一张三倍的名单,
posPools = [[13, 14, 15], [17, 19, 20], [16, 20, 22], [15, 16, 24], [15, 22, 23], [13, 20, 23], [15, 18, 19], [10, 15, 22], [7, 8, 9], [8, 10, 17], [15, 16, 17], [10, 15, 16], [8, 9, 15], [15, 16, 22], [7, 8, 9], [1, 8, 11], [1, 2, 4], [3, 6, 7], [10, 3, 1], [2, 5, 8]]posPools中的每个列表都代表了一个被污染的池,其中有3口井( x,y,z )的水。只有一口井(x或z)需要被污染才能污染整个池。共有24口井。
我有一份可能被污染的油井的清单,而且我肯定知道清单中没有的任何井#都没有被污染。
potPosWell = [4, 6, 8, 9, 15, 18, 20, 23]如果一个池(例如posPools = 13,14,15 )只包含一个与potPosWell相同的元素,例如# 15,那么我肯定知道#15井被污染了,我想将15添加到一个新的列表posWell中。
但是,如果池e.g.posPools8 = 7,8,9包含多个与potPosWell相同的元素,例如#8和#9,那么我不想在posWell中添加8或9。(这是因为我不知道8号或9号井是否污染了游泳池)。
输出应该是
posWell = [4,6,8,15,20]我不知道如何在posPools上迭代以检查每个子列表是否只有一个公共中的元素,然后将该元素追加到一个新的list posWell中。
我的工作思路是:首先,在posPools中找到哪些三元组只共享一个与potPosWell相同的元素,并将这些三元组附加到一个新的嵌套列表中。其次,确定每个三元组中的哪个元素等效于potPosWells,并将其附加到PosWell中。第三,消除posWells中的重复元素。
我甚至不确定我现在拥有的数据结构是否适合于这种比较。
这些列表很小,可以手工完成,但我突然意识到,这将是一个有趣的东西,可以编程到Python中。唉,我还不太懂Python来清理这个阶段的数据。如果有人给我举例说明如何实现我的想法,我会非常感激的。
*编辑: posPools 10,3,1中有一个池不包含来自potPosWell的井。这意味着当检测到污染时,它是假阳性的。所有的10,3或1口井实际上都没有受到污染,因为potPosWell中没有一口井被污染。
发布于 2022-02-11 04:41:05
使用set.intersection的一种方法
pot = set(potPosWell)
list({i.pop() for pool in posPools if len(i:=pot.intersection(pool)) == 1})如果您使用的服务器少于python 3.8,请执行以下操作:
res = []
for pool in posPools:
i = pot.intersection(pool)
if len(i) == 1:
res.append(i.pop())输出:
[4, 6, 8, 15, 20]https://stackoverflow.com/questions/71075339
复制相似问题