[英]What is the fastest way to compare two lists with thounsands of entries?
我有
list1 = ["value1;value2;value3;value4;fdsa",]
list2 = ["value1;value2;value3;value4;asdf",]
我需要做的是遍历每个list2
条目,将索引0,1,2,3
值进行比较,如果它们匹配-在另一种方法中使用第四个条目。
现在我有这样的事情:
for entry1 in list1:
for entry2 in list2:
if entry2.split(';')[0] == entry1.split(';')[0]: #... etc, compare first 3 values
print(entry2.split(';')[4]) # edited out my code
#do stuff
这显然是可行的,但速度非常慢。 我正在使用Python 2.78
首先从list2的项创建字典,其中前四个项为键,第五个项为值。
dct = dict(x.rsplit(';', 1) for x in list2)
然后循环遍历list1并检查密钥是否存在于上面的字典中:
for x in list1:
k, v = x.rsplit(';', 1)
if k in dct:
val = dct[k]
#do something with val
如果list2
包含具有不同值的重复键,则您可能需要将它们存储在列表中:
from collections import defaultdict
d = defaultdict(list)
for x in list2:
k, v = x.rsplit(';', 1)
d[k].append(v)
for x in list1:
k, v = x.rsplit(';', 1)
for val in d[k]:
#do something with val
您正在多次拆分list1中的条目。 如果将它们拆分一次并将结果存储在变量中,则可以在内部循环中重用它。
为了避免每次与list1条目进行比较时都要拆分list2条目,将拆分列表存储在单独的变量中并与它们一起工作:
>>> l2=map(lambda x:x.split(';'),list2)
>>> [j[4] for i in list1 for j in l2 if i.split(';')[0] == j[0]]
['asdf']
基准测试:
list1 = ["value1;value2;value3;value4;fdsa",]
list2 = ["value1;value2;value3;value4;asdf",]
def test1():
l2=map(lambda x:x.split(';'),list2)
new=[j[4] for i in list1 for j in l2 if i.split(';')[0] == j[0]]
def test2():
new=[]
for entry1 in list1:
for entry2 in list2:
if entry2.split(';')[0] == entry1.split(';')[0]: #... etc, compare first 3 values
new.append(entry2.split(';')[4]) # edited out my code
#do stuff
if __name__ == '__main__':
import timeit
print 'test 1 : ',timeit.timeit("test1()", setup="from __main__ import test1")
print 'test 2 : ',timeit.timeit("test2()", setup="from __main__ import test2")
结果:
test 1 : 1.24494791031
test 2 : 1.34099817276
尝试这样:-
colon_sep_list1=list1.split(";")
colon_sep_list2=list2.split(";")
for index in range(len(colon_sep_list2)):
if index <=len(colon_sep_list1):
if colon_sep_list1[index]==colon_sep_list2[index]:
print colon_sep_list2[4]
break
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.