Python 如何有效地发现一个元组是否是另一个元组的子集
我知道Python 如何有效地发现一个元组是否是另一个元组的子集,python,subset,Python,Subset,我知道set实现非常棒。然而,它有一个巨大的局限性:它不能处理一个项目的重复 让我们使用整数: tuple1 = (100, 100, 375) layer = [(100, 100, 100, 375), (20, 100, 100, 375), (20, 20, 100, 375), (20, 20, 20, 375), (20, 20, 30, 375), (20, 20, 40, 375), (20, 20, 50, 375), (20, 20, 60, 375), (20, 20, 7
set
实现非常棒。然而,它有一个巨大的局限性:它不能处理一个项目的重复
让我们使用整数:
tuple1 = (100, 100, 375)
layer = [(100, 100, 100, 375), (20, 100, 100, 375), (20, 20, 100, 375), (20, 20, 20, 375), (20, 20, 30, 375), (20, 20, 40, 375), (20, 20, 50, 375), (20, 20, 60, 375), (20, 20, 70, 375), (20, 20, 80, 375), (20, 30, 100, 375), (20, 30, 30, 375), (20, 30, 40, 375), (20, 30, 50, 375), (20, 30, 60, 375), (20, 30, 70, 375), (20, 30, 80, 375), (20, 40, 100, 375), (20, 40, 40, 375), (20, 40, 50, 375), (20, 40, 60, 375), (20, 40, 70, 375), (20, 40, 80, 375), (20, 50, 100, 375), (20, 50, 50, 375), (20, 50, 60, 375), (20, 50, 70, 375), (20, 50, 80, 375), (20, 60, 100, 375), (20, 60, 60, 375), (20, 60, 70, 375), (20, 60, 80, 375), (20, 70, 100, 375), (20, 70, 70, 375), (20, 70, 80, 375), (20, 80, 100, 375), (20, 80, 80, 375), (30, 100, 100, 375), (30, 30, 100, 375), (30, 30, 30, 375), (30, 30, 40, 375), (30, 30, 50, 375), (30, 30, 60, 375), (30, 30, 70, 375), (30, 30, 80, 375), (30, 40, 100, 375), (30, 40, 40, 375), (30, 40, 50, 375), (30, 40, 60, 375), (30, 40, 70, 375), (30, 40, 80, 375), (30, 50, 100, 375), (30, 50, 50, 375), (30, 50, 60, 375), (30, 50, 70, 375), (30, 50, 80, 375), (30, 60, 100, 375), (30, 60, 60, 375), (30, 60, 70, 375), (30, 60, 80, 375), (30, 70, 100, 375), (30, 70, 70, 375), (30, 70, 80, 375), (30, 80, 100, 100), (30, 80, 100, 375), (30, 80, 80, 375), (40, 100, 100, 375), (40, 40, 100, 375), (40, 40, 40, 375), (40, 40, 50, 375), (40, 40, 60, 375), (40, 40, 70, 375), (40, 40, 80, 375), (40, 50, 100, 375), (40, 50, 50, 375), (40, 50, 60, 375), (40, 50, 70, 375), (40, 50, 80, 375), (40, 60, 100, 375), (40, 60, 60, 375), (40, 60, 70, 375), (40, 60, 80, 375), (40, 70, 100, 375), (40, 70, 70, 375), (40, 70, 80, 375), (40, 80, 100, 375), (40, 80, 80, 375), (50, 100, 100, 375), (50, 50, 100, 375), (50, 50, 50, 375), (50, 50, 60, 375), (50, 50, 70, 375), (50, 50, 80, 375), (50, 50, 80, 80), (50, 60, 100, 375), (50, 60, 60, 375), (50, 60, 70, 375), (50, 60, 80, 375), (50, 70, 100, 375), (50, 70, 70, 375), (50, 70, 70, 80), (50, 70, 80, 375), (50, 80, 100, 375), (50, 80, 80, 375), (50, 80, 80, 80), (60, 100, 100, 375), (60, 60, 100, 375), (60, 60, 60, 375), (60, 60, 70, 375), (60, 60, 80, 375), (60, 70, 100, 375), (60, 70, 70, 375), (60, 70, 80, 375), (60, 80, 100, 375), (60, 80, 80, 375), (60, 80, 80, 80), (70, 100, 100, 375), (70, 70, 100, 375), (70, 70, 70, 375), (70, 70, 80, 375), (70, 80, 100, 100), (70, 80, 100, 375), (70, 80, 80, 375), (80, 100, 100, 375), (80, 80, 100, 375), (80, 80, 80, 100), (80, 80, 80, 375)]
我想保留层
中的项目,这些项目不是由tuple1
的子集构成的。i、 例如,前两个必须去掉
现在我正在为循环使用:
new_layer = list()
for elt in layer:
copy = list(elt)
for x in tuple1:
if x in copy:
copy.remove(x)
if len(copy) == 1:
continue
else:
new_layer.append(elt)
还有比这更好的解决办法。。。此外,最后一个问题实际上更为复杂
我有5层:
- 第1层:
len的元素:2
- 第二层:
len
的元素:3
- 第3层:
len的元素:4
- 第4层:
len的元素
:5
- 第5层:
len的元素
:6
目标是在层N
中除去从层N-k
派生的元素(由子集构成)
感谢您的帮助:)这里有一种方法,即子类化和实现\uuuuuu包含
(对于操作符中的:
输出:
[(100, 100, 100, 375),
(20, 100, 100, 375),
(30, 100, 100, 375),
(40, 100, 100, 375),
(50, 100, 100, 375),
(60, 100, 100, 375),
(70, 100, 100, 375),
(80, 100, 100, 375)
]
[(100, 100, 100, 375),
(20, 100, 100, 375),
(30, 100, 100, 375),
(40, 100, 100, 375),
(50, 100, 100, 375),
(60, 100, 100, 375),
(70, 100, 100, 375),
(80, 100, 100, 375)
]
编辑:注意,这只关心元组中值的频率,而不关心它们在元组中的相对位置。因此,它也将匹配(375100100),即使元组的元素顺序相反。如果您认为它太宽,您可以添加注释吗?我们的目标是找到layer1
的元素,这些元素不包括tuple1
作为子集。它不能处理项目的重复。。。集合是专门为不包含重复项而制作的。@Eldelshell是的,我知道。当需要在较大的元素中查找子集时,它们非常方便。但不能将它们用于重复项目的元素。因此,我正在寻找另一种比我的解决方案更优雅、性能更好的解决方案。太好了,我实际上不在乎订单,所以更好:)谢谢!我来试试这个!好的,它工作得很好,很好。然而,已经有很长一段时间了,我不知道它是如何工作的。什么是super()
<代码>其他
是一个命令吗?什么是self.get()
调用?计数器在哪里计数?我很想学习更多关于实现的知识,因为在这方面我有很多新东西!从我得到的信息来看,\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu将实现中的操作符,就像\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuq>对所做的那样,但我实际上不理解在另一个中声明一个元素会执行什么操作。关于\u。在这种情况下,该方法做两件事。(1) 确保x
inx in y
中的x也是一个TupleCounter对象(如果不是,它会创建一个),并且(2)比较“self”中每个元素出现的次数与“other”中每个元素出现的次数<代码>计数器
,您正在子类化的类可能值得研究。我已经使用了计数器
,我对它非常熟悉。这是子类化的想法,听起来很有趣。无论如何,我需要更多的研究,非常感谢!
needle = (100, 100, 375)
layer = [(100, 100, 100, 375), (20, 100, 100, 375), (20, 20, 100, 375), (20, 20, 20, 375), (20, 20, 30, 375), (20, 20, 40, 375), (20, 20, 50, 375), (20, 20, 60, 375), (20, 20, 70, 375), (20, 20, 80, 375), (20, 30, 100, 375), (20, 30, 30, 375), (20, 30, 40, 375), (20, 30, 50, 375), (20, 30, 60, 375), (20, 30, 70, 375), (20, 30, 80, 375), (20, 40, 100, 375), (20, 40, 40, 375), (20, 40, 50, 375), (20, 40, 60, 375), (20, 40, 70, 375), (20, 40, 80, 375), (20, 50, 100, 375), (20, 50, 50, 375), (20, 50, 60, 375), (20, 50, 70, 375), (20, 50, 80, 375), (20, 60, 100, 375), (20, 60, 60, 375), (20, 60, 70, 375), (20, 60, 80, 375), (20, 70, 100, 375), (20, 70, 70, 375), (20, 70, 80, 375), (20, 80, 100, 375), (20, 80, 80, 375), (30, 100, 100, 375), (30, 30, 100, 375), (30, 30, 30, 375), (30, 30, 40, 375), (30, 30, 50, 375), (30, 30, 60, 375), (30, 30, 70, 375), (30, 30, 80, 375), (30, 40, 100, 375), (30, 40, 40, 375), (30, 40, 50, 375), (30, 40, 60, 375), (30, 40, 70, 375), (30, 40, 80, 375), (30, 50, 100, 375), (30, 50, 50, 375), (30, 50, 60, 375), (30, 50, 70, 375), (30, 50, 80, 375), (30, 60, 100, 375), (30, 60, 60, 375), (30, 60, 70, 375), (30, 60, 80, 375), (30, 70, 100, 375), (30, 70, 70, 375), (30, 70, 80, 375), (30, 80, 100, 100), (30, 80, 100, 375), (30, 80, 80, 375), (40, 100, 100, 375), (40, 40, 100, 375), (40, 40, 40, 375), (40, 40, 50, 375), (40, 40, 60, 375), (40, 40, 70, 375), (40, 40, 80, 375), (40, 50, 100, 375), (40, 50, 50, 375), (40, 50, 60, 375), (40, 50, 70, 375), (40, 50, 80, 375), (40, 60, 100, 375), (40, 60, 60, 375), (40, 60, 70, 375), (40, 60, 80, 375), (40, 70, 100, 375), (40, 70, 70, 375), (40, 70, 80, 375), (40, 80, 100, 375), (40, 80, 80, 375), (50, 100, 100, 375), (50, 50, 100, 375), (50, 50, 50, 375), (50, 50, 60, 375), (50, 50, 70, 375), (50, 50, 80, 375), (50, 50, 80, 80), (50, 60, 100, 375), (50, 60, 60, 375), (50, 60, 70, 375), (50, 60, 80, 375), (50, 70, 100, 375), (50, 70, 70, 375), (50, 70, 70, 80), (50, 70, 80, 375), (50, 80, 100, 375), (50, 80, 80, 375), (50, 80, 80, 80), (60, 100, 100, 375), (60, 60, 100, 375), (60, 60, 60, 375), (60, 60, 70, 375), (60, 60, 80, 375), (60, 70, 100, 375), (60, 70, 70, 375), (60, 70, 80, 375), (60, 80, 100, 375), (60, 80, 80, 375), (60, 80, 80, 80), (70, 100, 100, 375), (70, 70, 100, 375), (70, 70, 70, 375), (70, 70, 80, 375), (70, 80, 100, 100), (70, 80, 100, 375), (70, 80, 80, 375), (80, 100, 100, 375), (80, 80, 100, 375), (80, 80, 80, 100), (80, 80, 80, 375)]
needle = TupleCounter(needle)
filtered = [t for t in layer if needle in TupleCounter(t)]
print(filtered)
[(100, 100, 100, 375),
(20, 100, 100, 375),
(30, 100, 100, 375),
(40, 100, 100, 375),
(50, 100, 100, 375),
(60, 100, 100, 375),
(70, 100, 100, 375),
(80, 100, 100, 375)
]