2014-10-03 59 views
0

什麼是比較兩個名單與條目的最快方式?

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

回答

0

您正在拆分list1中的條目多次。如果您將它們拆分一次並將結果存儲在變量中,則可以在內部循環中重用它。

+0

我不知道,如果這增加的速度,但如果它確實這幾乎是不明顯的。 – 2014-10-03 15:02:21

1

首先從list2的項目中創建一個字典,前四項作爲鍵,第五項作爲值。

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

然後遍歷列表1,檢查重點在上面字典存在:

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 
+0

'{x [:x.rindex(「;」)]:x [x.rindex(「;」)+ 1:] for x in list2}'可能會更快 – 2014-10-03 10:00:56

0

爲了避免每一次分裂列表2項與列表1項比較分裂列表存儲在一個單獨的變量,並與他們一起工作:

>>> 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 
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 
相關問題