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

除此之外,转换成集合的形式,还可以做更多的操作,求交集、并集、差集等等。


  1. 列表(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列表的顺序改动了下,得到的是截然不同的结果。
所以在选择方法时,需要根据实际情况来决定那种方式适合你的程序或脚本。

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

  1. 如何在Python中串联两个列表?

    如何在Python中串联两个列表? 例: listone = [1, 2, 3] listtwo = [4, 5, 6] 预期结果: >>> joinedlist [1, 2, 3, ...

  2. python 两个列表比较_如何在Python中比较两个列表

    python 两个列表比较 In this article, we will understand the different ways to compare two lists in Python. ...

  3. python中怎么比较两个列表-python中比较两个列表的实例方法

    cmp() 方法用于比较两个列表的元素. cmp()方法语法: cmp(list1, list2) 参数: list1 -- 比较的列表.list2 -- 比较的列表. 返回值: 如果比较的元素是同类 ...

  4. pythongps距离_在Python中求两个gps点之间的距离

    我有下面的方法(haversine)返回两个gps点之间的距离.下表是我的数据帧.在 当我使用在dataframe上应用函数时,我得到错误"cannot convert the series ...

  5. python 对应元素相乘_如何在Python中执行两个列表的元素相乘?

    使用与zip()混合的列表理解:. [a*b for a,b in zip(lista,listb)] 由于您已经在使用numpy ,所以将数据存储在一个numpy数组而不是列表中是很有意义的. 一旦 ...

  6. python中怎么比较两个列表-如何比较python中的两个列表并返回匹配

    快速性能测试显示Lutz的解决方案是最好的:import timedef speed_test(func): def wrapper(*args, **kwargs): t1 = time.time( ...

  7. python一行输出多个数据_如何在Python中让两个print()函数的输出打印在一行内?

    1.两个连续的print()函数为什么在输出时内容会分行显示? 解:print()中有两个默认参数sep和end,其中sep是代替分隔符,end是代替末尾的换行符,默认使用','代替空格,且默认末尾加 ...

  8. python中比较两个list是否有相同的元素及相同元素的个数

    文章目录 参考网址 判断两个list是否有重复元素 方法一,用遍历 方法二,用set取交集 判断两个列表中不同的值 在list1中而不在list2中的元素 在list2中而不在list1中的元素 参考 ...

  9. 如何在python中找到两个日期时间对象之间的时差?

    本文翻译自:How do I find the time difference between two datetime objects in python? 如何分辨两个datetime对象之间的时 ...

最新文章

  1. [THUWC2017]在美妙的数学王国中畅游
  2. 一个简单的路由映射,让你的树莓派通过SSH外网可访问
  3. java文件服务器开源,附架构师必备技术详解
  4. jQuery中的slideUp()、slideDown()、hide()、show()
  5. php 调用 perl,在PHP中使用与Perl兼容的正则表达式
  6. Inherits、CodeFile、CodeBehind
  7. 基于声波的手势识别技术
  8. 计算机考研专业课数字,2020北京航空航天大学计算机考研初试专业课经验
  9. 【整数规划算法】分支定界法及其Python代码实现
  10. 用百用计算机弹出,CPU使用率老是100%怎么办?小编详解解决CPU过高的问题
  11. 2003年高考语文全国最高分_最新消息!2020高考语文数学题型大变!全国卷或有多套题...
  12. P6617 查找 Search (线段树)
  13. Unity Shader:实现菲涅尔+色散效果以及相关原理解析
  14. uniapp自定义整包更新与热更新
  15. 【mysql】 mysql备份还原时发生异常:导入mysql文件提示“ASCII '\0' appeared in the statement”
  16. Flowable 数据库表结构 ACT_GE_BYTEARRAY
  17. 广州大学 操作系统实验之银行家算法
  18. 营增利降的美年健康,还能坐稳“民营体检第一股”吗?
  19. 计算机存储金字塔层次结构:寄存器 高速缓存 内存 硬盘
  20. 【FPGA】用Verilog代码实现无源蜂鸣器驱动实验

热门文章

  1. Android SDK安装及配置模拟器
  2. 卸载 ibus 使Ubuntu16.04任务栏与桌面图标消失
  3. 用免疫算法解决TSP问题
  4. 【c】分数类型的定义 c语言分数类型加减乘除的实现
  5. Cocos2d的ChipMunk
  6. 【解决】联想拯救者vmware启动虚拟机蓝屏重启问题
  7. OA项目之部门管理的功能实现
  8. 阿D SQL注入工具常用的一些注入命令
  9. 无障碍设计标准中的对比度
  10. php酷狗音乐json,酷狗音乐API