将两个列表与数千个条目进行比较的最快方法是什么?

时间:2014-10-03 08:57:04

标签: python

我有

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

4 个答案:

答案 0 :(得分:1)

首先从list2的项目创建一个字典,前四个项目作为键,第五个项目作为值。

dct = dict(x.rsplit(';', 1) for x in list2)

然后遍历list1并检查上面的dict中是否存在密钥:

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

答案 1 :(得分:0)

您正在多次拆分list1中的条目。如果将它们拆分一次并将结果存储在变量中,则可以在内循环中重复使用它。

答案 2 :(得分:0)

为避免每次与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

答案 3 :(得分:0)

试试这样: -

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