我需要判断一个给定的列表是否等于用另一个列表中的某些元素替换某些列表的结果.具体地说,我有一本字典,比如f = {'o': ['a', 'b'], 'l': ['z'], 'x': ['y']}
和一个列表list1 = ['H', 'e', 'l', 'l', 'o']
,所以我想判断list2
是否等于['H', 'e', 'z', 'z', 'a', 'b']
.
下面,我首先编写一个函数apply
来计算f
下list1
的图像.那么,写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)
我认为第二种方法会更快,因为它不通过函数构造第一个列表的映像,然后判断与第二个列表的相等性.相反,它在不构建新列表的情况下"即时"判断平等性.所以我惊讶地发现它并没有更快(甚至有点慢).记录如下:list1
、list2
,字典中的值列表都很小(通常小于50个元素),字典的键数也很小.
所以我的问题是:为什么第二种方法不能更快?还有:有没有更快的方法(可能使用其他数据 struct )?
Edit回应 comments :list1
和list2
通常是不同的,但f
对其中一些人来说可能是共同的.通常情况下,在大约50个连续判断的批次中,可能会有大约list1
000个判断,一个普通的f
个.列表的元素是短字符串.所有判断都会返回True(因此必须迭代整个列表).