繁体   English   中英

比较两个包含大量条目的列表的最快方法是什么?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM