python 双指针列表对比 列表对比

9 篇文章 0 订阅
8 篇文章 0 订阅
# -*- coding = utf-8 -*-
# @Time : 2022/6/27 17:20
# @Author : Suage
# @File : my_list_comparator.py

# 对比函数
def list_comparator(lis1: list, lis2: list):
    """
    对比两个列表, 并返回差异
    :param lis1: 列表1
    :param lis2: 列表2
    :return: dict Keys:<br>
    'equal(bool)':两个列表是否相同<br>
    'l1_lacks(list)':列表2中有但列表1中没有<br>
    'l2_lacks(list)':列表1中有但列表2中没有
    """
    _l1 = list(set(lis1))
    _l2 = list(set(lis2))
    _l1.sort()
    _l2.sort()
    _l1_lacks = list()
    _l2_lacks = list()
    _i = _j = 0
    _l1_length = len(_l1)
    _l2_length = len(_l2)
    while _i < _l1_length and _j < _l2_length:
        if _l1[_i] == _l2[_j]:  # 相等情况, 双指针后移
            _i += 1
            _j += 1
        elif _l1[_i] > _l2[_j]:  # 不相等情况, l2中的元素l1中没有
            _l1_lacks.append(_l2[_j])
            _j += 1
        else:  # 不相等情况, l1中的元素l2中没有
            _l2_lacks.append(_l1[_i])
            _i += 1
    if _i < _l1_length:  # 当对比结束, l1剩余元素即为l2缺少元素
        for _index in range(_i, _l1_length):  # 循环添加至l1_lacks
            _l2_lacks.append(_l1[_index])
    if _j < _l2_length:  # 当对比结束, l2剩余元素即为l1缺少元素
        for _index in range(_j, _l2_length):  # 循环添加至l2_lacks
            _l1_lacks.append(_l2[_index])
    return {
        'equal': not (_l1_lacks or _l2_lacks),
        'l1_lacks': _l1_lacks,
        'l2_lacks': _l2_lacks,
    }


# 测试代码
from random import randint
from time import time

min_range = 5
max_range = 10
quantity = lambda: randint(min_range, max_range)
num = lambda: randint(-max_range, max_range)
print('排序前:')
l1 = list(num() for _ in range(quantity()))
print(l1)
l2 = list(num() for _ in range(quantity()))
print(l2)
print('开始对比')
st = time()
my_res = list_comparator(l1, l2)
cost = time() - st
print('对比结束')
l1.sort()
l2.sort()

print('排序后:')
print(l1)
print(l2)
print('对比结果:')
print(my_res)
print(f"Cost time: {cost:.2f}s")

测试代码运行结果:
排序前:
[6, -10, -10, 5, -8]
[-8, -2, 8, -6, 3, -8, 8]
开始对比
对比结束
排序后:
[-10, -10, -8, 5, 6]
[-8, -8, -6, -2, 3, 8, 8]
对比结果:
{‘equal’: False, ‘l1_lacks’: [-6, -2, 3, 8], ‘l2_lacks’: [-10, 5, 6]}
Cost time: 0.00s

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值