我有
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 :(得分: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