Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何有效地发现一个元组是否是另一个元组的子集_Python_Subset - Fatal编程技术网

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
in
x 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) ]