检查集合是否仅包含其他集合中的元素的最佳方法是什么?

时间:2012-05-09 17:51:43

标签: python

检查数组/元组/列表是否只包含另一个数组/元组/列表中的元素的最佳方法是什么?

我尝试了以下两种方法,对于不同类型的集合,它们更好/更pythonic? 我可以使用哪些其他(更好)的方法进行此检查?

import numpy as np

input = np.array([0, 1, -1, 0, 1, 0, 0, 1])
bits = np.array([0, 1, -1])

# Using numpy
a=np.concatenate([np.where(input==bit)[0] for bit in bits])
if len(a)==len(input):
    print 'Valid input'

# Using sets
if not set(input)-set(bits):
    print 'Valid input'

3 个答案:

答案 0 :(得分:5)

由于您已经在使用numpy数组,因此可以使用in1d函数:

>>> import numpy as np
>>> 
>>> input = np.array([0, 1, -1, 0, 1, 0, 0, 1])
>>> bits = np.array([0, 1, -1])
>>> 
>>> if np.in1d(input, bits).all():
...     print 'Valid input'
... 
Valid input

答案 1 :(得分:4)

你的# Using numpy对于大型集合效率非常低,因为它会创建输入列表的完整副本。

我可能会这样做:

if all(i in bits for i in input):
    print 'Valid input'

这是一种非常 pythonic方式来编写您正在尝试执行的操作,并且它的好处是它不会创建整个list(或set )可能很大,并且它第一次遇到False中不在input的元素时会停止(并返回bits

答案 2 :(得分:2)

一般情况下,您只需使用set方式,它可能比使用operator重新计算新集更快:

input = set([0, 1, -1, 0, 1, 0, 0, 1])
bits = set([0, 1, -1])

input.issubset(bits)

编辑:

issubset是针对这个问题编写的一种方法(参见http://hg.python.org/releasing/2.7.3/file/7bb96963d067/Objects/setobject.c的来源)。它基本上等同于:

def issubset(self, other):
    if len(self) > len(other):
        return False

    for i in self:
        if i not in other:
            return False

    return True