python 判断两个列表间是否具有包含关系以及获取子列表在父列表中的索引

博客主要围绕Python列表展开,包含相关代码内容,聚焦于信息技术领域中Python语言里列表的运用。

代码

#!/usr/bin/env python
# coding=utf-8
import operator
def get_sub_list_index(parent_list, sub_list):
    length_sub_list = len(sub_list)
    index_list = []
    counter = 0 
    while True:
        tem_list = parent_list[counter:counter + length_sub_list]
        if operator.eq(sub_list, tem_list):
            index_list.append(counter)
        counter += 1
        if counter > len(parent_list)-length_sub_list:
            break
    return index_list

if __name__ == "__main__":
    parent_list = [4249065, 48, 224, 998, 11, 13, 14, 6, 2, 6, 106, 74, 21362, 8, 1, 3 , 5, 23, 6, 2, 27, 11, 13, 14, 6, 6, 19791, 13, 8, 1, 3, 2, 27, 11, 15, 14, 8, 511, 13, 8
    sub_list = [11, 13, 14, 6]

    # 获取索引
    ret = get_sub_list_index(parent_list, sub_list)

    # 判断是否具有包含关系
    if len(ret) == 0:
        print("不具有包含关系")
    else:
        print("具有包含关系")
        print("子列表在父列表中的索引是:", ret)
<think> 我们正在讨论Python中如何判断一个值是否存在于列表内。根据用户的问题和提供的引用,我们需要总结几种常见的方法。 引用[1]提到序列可以进行成员判断操作,引用[2]和[3]则给出了具体的代码示例,包括使用身份运算符和直接判断。 常见方法如下: 1. 使用`in`关键字:这是最直接的方法,判断元素是否列表中。 2. 使用循环遍历:手动遍历列表进行比较。 3. 使用`count()`方法:统计元素出现的次数,大于0则存在。 4. 使用`index()`方法:尝试获取元素的索引,如果元素不存在则会抛出异常,因此可以配合异常处理。 我们将重点介绍`in`关键字,因为它是最简洁、最常用的方法。 另外,引用[2]中提到了身份运算符`is`,但需要注意的是,`is`用于判断两个对象是否是同一个对象(即内存地址相同),而`==`用于判断是否相等。在判断元素是否存在时,我们通常使用值相等,所以用`in`关键字即可,它内部使用`==`进行比较。 下面我们详细说明这些方法。 </think> ### Python判断是否存在于列表的方法 在Python中,判断一个值是否存在于列表是常见操作,主要通过以下几种高效方法实现: #### 1. **使用`in`关键字(最推荐)** 直接使用成员运算符`in`进行判断,返回布尔值: ```python numbers = [1, 2, 3, 4, 5] print(3 in numbers) # 输出: True print(6 in numbers) # 输出: False ``` 时复杂度为$O(n)$,简洁高效,适用于大多数场景[^1][^3]。 #### 2. **使用`count()`方法** 通过统计元素出现次数判断: ```python names = ['Alice', 'Bob', 'Charlie'] if names.count('Bob') > 0: print("存在") # 输出: 存在 ``` 该方法完整遍历列表,时复杂度$O(n)$,适合需要统计数量的场景。 #### 3. **使用`index()`方法定位** 尝试获取元素索引,结合异常处理: ```python try: index = names.index('David') # 不存在则抛出ValueError print(f"索引位置: {index}") except ValueError: print("元素不存在") # 输出: 元素不存在 ``` 适合需要获取元素位置的场景[^3]。 #### 4. **手动遍历列表** 通过循环逐一比较元素: ```python target = 'Charlie' found = False for name in names: if name == target: found = True break print(found) # 输出: True ``` 时复杂度$O(n)$,灵活性高但代码较冗余。 #### 5. **使用集合加速查找(大型列表优化)** 对于大型列表,可转为集合提高查找效率: ```python large_list = list(range(1000000)) # 百万级列表 large_set = set(large_list) # 转换为集合 print(999999 in large_set) # 输出: True (时复杂度O(1)) ``` 集合查找时复杂度为$O(1)$,但转换过程消耗$O(n)$时,适合多次查询场景[^1]。 ### 选择建议 | **场景** | **推荐方法** | **时复杂度** | |-------------------------|---------------|---------------| | 简单判断存在性 | `in`关键字 | $O(n)$ | | 需要元素位置 | `index()` | $O(n)$ | | 需要统计出现次数 | `count()` | $O(n)$ | | 大型列表多次查询 | 转为集合 | $O(1)$查询 | > **注意**: > - 字符串查找区分大小写:`'Bob' in ['bob']`返回`False` > - 对象比较使用`is`检查内存地址,`==`检查值相等[^2] > - 空列表判断始终返回`False`:`5 in [] → False` ### 完整示例 ```python # 用户输入检查 names = ['Alice', 'Bob', 'Charlie'] new_name = input("输入姓名: ") if new_name in names: print(f"{new_name}已存在") else: names.append(new_name) print(f"已添加{new_name}, 新列表: {names}") ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值