我需要判断一个给定的列表是否等于用另一个列表中的某些元素替换某些列表的结果.具体地说,我有一本字典,比如f = {'o': ['a', 'b'], 'l': ['z'], 'x': ['y']}和一个列表list1 = ['H', 'e', 'l', 'l', 'o'],所以我想判断list2是否等于['H', 'e', 'z', 'z', 'a', 'b'].

下面,我首先编写一个函数apply来计算flist1的图像.那么,写list2 == apply(list1, f)就足够了.因为这个函数在我的程序中会被调用数千次,所以我需要让它非常快.因此,我想到了下面的第二个函数,它应该更快,但事实证明并非如此.所以我的问题(详情如下)是:为什么?还有:有没有更快的方法?

第一个功能:

def apply(l, f):
    result = []
    for x in l:
        if x in f:
            result.extend(f[x])
        else:
            result.append(x)
    return result

第二个功能:

def apply_equal(list1, f, list2):
    i = 0
    for x in list1:
        if x in f:
            sublist = f[x]
            length = len(sublist)
            if list2[i:i + length] != substmt:
                return False
            i += length
        else:
            if list2[i] != x:
                return False
            i += 1
    return i == len(list2)

我认为第二种方法会更快,因为它不通过函数构造第一个列表的映像,然后判断与第二个列表的相等性.相反,它在不构建新列表的情况下"即时"判断平等性.所以我惊讶地发现它并没有更快(甚至有点慢).记录如下:list1list2,字典中的值列表都很小(通常小于50个元素),字典的键数也很小.

所以我的问题是:为什么第二种方法不能更快?还有:有没有更快的方法(可能使用其他数据 struct )?

Edit回应 comments :list1list2通常是不同的,但f对其中一些人来说可能是共同的.通常情况下,在大约50个连续判断的批次中,可能会有大约list1000个判断,一个普通的f个.列表的元素是短字符串.所有判断都会返回True(因此必须迭代整个列表).

推荐答案

如果没有合适的数据来进行基准测试,这很难说,所以我用各种"大小"的数据测试了各种解决方案.

  1. result += f[x]代替result.extend(f[x])总是让它更快.

  2. 对于较长的列表(使用itertools.chain个):

    list2 == list(chain.from_iterable(map(f.get, list1, zip(list1))))
    
  3. 如果数据允许,显式存储所有可能的密钥并始终使用f[x]访问将加快速度.也就是说,提前为所有"缺失"键设置f[k] = k,,这样你就不必判断in或使用get.

Python相关问答推荐

如果ID匹配并且mp.isclose为真,则将列从一个收件箱复制到另一个收件箱

Pandas或pyspark跨越列创建

如何分割我的收件箱,以便连续的数字各自位于自己的收件箱中?

在Docker中运行HAProxy时无法获得503服务

如何从格式为note:{neighbor:weight}的字典中构建networkx图?

如何使用PyTest根据self 模拟具有副作用的属性

如何将带有逗号分隔的数字的字符串解析为int Array?

覆盖Django rest响应,仅返回PK

如何通过多2多字段过滤查询集

用gekko解决的ADE方程系统突然不再工作,错误消息异常:@错误:模型文件未找到.& &

如何从FDaGrid实例中删除某些函数?

如何使用scipy从频谱图中回归多个高斯峰?

删除最后一个pip安装的包

删除任何仅包含字符(或不包含其他数字值的邮政编码)的观察

在Python Attrs包中,如何在field_Transformer函数中添加字段?

如何在类和classy-fastapi -fastapi- followup中使用FastAPI创建路由

在Wayland上使用setCellWidget时,try 编辑QTable Widget中的单元格时,PyQt 6崩溃

如何更改分组条形图中条形图的 colored颜色 ?

如何在Python数据框架中加速序列的符号化

SQLAlchemy Like ALL ORM analog