python中确定两个列表(list)之间是否为子集关系 您所在的位置:网站首页 python字典子集 python中确定两个列表(list)之间是否为子集关系

python中确定两个列表(list)之间是否为子集关系

2024-06-01 03:28| 来源: 网络整理| 查看: 265

将列表(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]) False

A==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 实验室设备网 版权所有