You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中如何判断两个不可哈希对象列表是否无序匹配(含重复)?

解决方案

针对不可哈希对象的列表匹配需求,这里提供两种比O(n²)更高效、符合Python风格的实现方式:

方法一:计数统计(最优时间复杂度O(n+m))

利用对象的属性生成唯一可哈希标识,统计list1中各元素的出现次数,再遍历list2验证每个元素都有足够的匹配次数。

from collections import defaultdict

def has_all_elements(list1, list2):
    # 生成Car对象的唯一标识键(需保证属性顺序固定,与==逻辑一致)
    def get_car_key(car):
        # 示例:若Car有make、model、year属性,按固定顺序打包为元组
        return (car.make, car.model, car.year)
        # 若属性不固定,可使用:return tuple(sorted(car.__dict__.items()))
    
    # 统计list1中各元素的出现次数
    count_map = defaultdict(int)
    for car in list1:
        count_map[get_car_key(car)] += 1
    
    # 检查list2的每个元素是否在list1中有剩余匹配
    for car in list2:
        key = get_car_key(car)
        if count_map.get(key, 0) == 0:
            return False
        count_map[key] -= 1
    
    return True

方法二:排序+双指针(时间复杂度O(n logn + m logm))

通过排序将相同元素归为一组,再用双指针遍历两个有序列表,验证list2的所有元素都能在list1中找到匹配。

def has_all_elements(list1, list2):
    def get_car_key(car):
        return (car.make, car.model, car.year)
    
    # 按属性键排序两个列表
    sorted_list1 = sorted(list1, key=get_car_key)
    sorted_list2 = sorted(list2, key=get_car_key)
    
    i = j = 0
    len1, len2 = len(sorted_list1), len(sorted_list2)
    
    while i < len1 and j < len2:
        if sorted_list1[i] == sorted_list2[j]:
            j += 1  # 找到匹配,移动list2指针
        i += 1  # 无论是否匹配,都移动list1指针(允许list1有更多元素)
    
    # 若list2所有元素都匹配完成,j会走到末尾
    return j == len2

注意事项

  • 两种方法都依赖get_car_key生成的标识与__eq__逻辑一致,确保属性相同的对象生成相同的键。
  • 若未给sort传入key参数,需确保Car类重载了比较运算符(如__lt__),否则排序会报错。

内容的提问来源于stack exchange,提问作者Prospero

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 18:06:22