检查数组/元组/列表是否只包含另一个数组/元组/列表中的元素的最佳方法是什么?
我尝试了以下两种方法,对于不同类型的集合,它们更好/更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'
答案 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