python中确定两个列表(list)之间是否为子集关系 | 您所在的位置:网站首页 › python字典子集 › python中确定两个列表(list)之间是否为子集关系 |
将列表(list)转换成集合(set)作比较
>>> A = [1,2,3,4,5]
>>> B = [1,2,3]
>>> C = [1,2,3,4,5]
>>> set(A) < set(B) #A是B的真子集?False
False
>>> set(A) > set(B) #B是A的真子集?True
True
>>> set(A) > set(C) #C是A的真子集?False
False
>>> set(A) >= set(C) #C是A的子集?True
True
这种方法在某些情况下可能不适用,比如列表中有重复值的情况下: >>> D = [1,2,3,4,4,4,5,5,5] >>> print set(D) #列表转换成集合时会去重,在某些场景下需要考虑这个问题。 set([1, 2, 3, 4, 5])除此之外,转换成集合的形式,还可以做更多的操作,求交集、并集、差集等等。 列表(list)通过逻辑操作比较两个列表 A 和 B,其中 A 与 B 中的一个元素存在,如下: >>> A = [1,2,3] >>> B = [4,5,6,[1,2,3],7] >>> C = [1,2,3,4,5,6,7] >>> A in C False >>> A in B True >>> print B[3] [1, 2, 3]A整体作为一个元素,也算是子集。只含有A这个列表的子集。 上面的方式算是个特例。 此外,还有一种方式可以实现: >>> A = [1,2,3] >>> B = [1,2,3,4,5,6] >>> any([A==B[i:i+len(A)] for i in range(0,len(B)-len(A)+1)]) True我们来分析下这套语句的工作原理: any([A==B[i:i+len(A)] for i in range(0,len(B)-len(A)+1)]) 由外向内分离,整体两层 any()和A==B[i:i+len(A)] for i in range(0,len(B)-len(A)+1) any(),只要其中任何一项为True就返回True。 >>> any([True,False,False]) True >>> any([False,False,False]) FalseA==B[i:i+len(A)] for i in range(0,len(B)-len(A)+1),一个for循环的简单写法。 简单套一下,可以知道循环B比A的列表长度长的次数,每次把B列表的切割和A列表作比较,看是否相等。所以上述步骤是这样的。 >>> A = [1,2,3] >>> B = [1,2,3,4,5,6] >>> [A==B[i:i+len(A)] for i in range(0,len(B)-len(A)+1)] [True, False, False, False] >>> any([True, False, False, False]) True我们理解这条语句是如何工作的之后,我们会发现一个问题就是当A列表和B列表的切片比对时,可能会发生因为顺序不匹配导致无法认定为子集的情况,这显然是不符合数学上的定义的。 >>> A = [1,2,3] >>> B = [1,4,3,2,5,6] >>> any([A==B[i:i+len(A)] for i in range(0,len(B)-len(A)+1)]) False可以看到只是把B列表的顺序改动了下,得到的是截然不同的结果。 所以在选择方法时,需要根据实际情况来决定那种方式适合你的程序或脚本。 |
CopyRight 2018-2019 实验室设备网 版权所有 |