首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >查找三元组列表和平面列表之间的单个公共元素

查找三元组列表和平面列表之间的单个公共元素
EN

Stack Overflow用户
提问于 2022-02-11 04:27:42
回答 1查看 32关注 0票数 1

我有一张三倍的名单,

代码语言:javascript
运行
复制
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口井。

我有一份可能被污染的油井的清单,而且我肯定知道清单中没有的任何井#都没有被污染。

代码语言:javascript
运行
复制
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号井是否污染了游泳池)。

输出应该是

代码语言:javascript
运行
复制
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中没有一口井被污染。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-02-11 04:41:05

使用set.intersection的一种方法

代码语言:javascript
运行
复制
pot = set(potPosWell)

list({i.pop() for pool in posPools if len(i:=pot.intersection(pool)) == 1})

如果您使用的服务器少于python 3.8,请执行以下操作:

代码语言:javascript
运行
复制
res = []
for pool in posPools:
    i = pot.intersection(pool)
    if len(i) == 1:
        res.append(i.pop())

输出:

代码语言:javascript
运行
复制
[4, 6, 8, 15, 20]
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71075339

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档