有效地比较两个大型列表的每个列表中的第一项?

时间:2016-07-14 18:35:36

标签: python list python-3.x

我目前正在处理大量列表(~280k列表)和较小列表(~3.5k列表)。我试图有效地将较小列表中的第一个索引与大列表中的第一个索引进行比较。如果它们匹配,我想返回具有匹配的第一个索引的小型和大型列表中的两个列表。

例如:

大单1:

[[a,b,c,d],[e,f,g,h],[i,j,k,l],[m,n,o,p]]

较小的清单2:

[[e,q,r,s],[a,t,w,s]]

会返回

[([e,q,r,s],[e,f,g,h]),([a,t,w,s],[a,b,c,d])]

我目前正在设置如下所示,其中返回一个元组列表,每个元组保存两个具有匹配的第一个元素的列表。我对使用的任何其他数据结构都很好。我试图使用一组元组,但是在试图弄清楚如何比我已经拥有的更快时遇到问题。

我比较这两个列表列表的代码目前是:

match = []
for list_one in small_list:
    for list_two in large_list:
        if str(list_one[0]).lower() in str(list_two[0]).lower():
            match.append((spm_values, cucm_values))
            break
return match

3 个答案:

答案 0 :(得分:4)

假设顺序无关紧要,我强烈建议使用字典将前缀(一个字符)映射到项目,并set查找匹配项:

# generation of data... not important
>>> lst1 = [list(c) for c in ["abcd", "efgh", "ijkl", "mnop"]]
>>> lst2 = [list(c) for c in ["eqrs", "atws"]]

# mapping prefix to list (assuming uniqueness)
>>> by_prefix1 = {chars[0]: chars for chars in lst1}
>>> by_prefix2 = {chars[0]: chars for chars in lst2}

# actually finding matches by intersecting sets (fast)
>>> common = set(by_prefix1.keys()) & set(by_prefix2.keys())
>>> tuples = tuple(((by_prefix1[k], by_prefix2[k]) for k in common))
>>> tuples

答案 1 :(得分:0)

这是使用列表理解的一个班轮。不过,我不确定它的效率如何。

large = [list(c) for c in ["abcd", "efgh", "ijkl", "mnop"]]
small = [list(c) for c in ["eqrs", "atws"]]
ret = [(x,y) for x in large for y in small if x[0] == y[0]]

print ret
#output
[(['a', 'b', 'c', 'd'], ['a', 't', 'w', 's']), (['e', 'f', 'g', 'h'], ['e', 'q', 'r', 's'])]

答案 2 :(得分:-1)

我实际上使用的是Python 2.7.11,虽然我想这可行。

l1 =[['a','b','c','d'],['e','f','g','h'],['i','j','k','l'],['m','n','o','p']]
l2 =[['e','q','r','s'],['a','t','w','s']]

def org(Smalllist,Largelist):
    L = Largelist
    S = Smalllist
    Final = [] 
    for i in range(len(S)):
        for j in range(len(L)):
            if S[i][0] == L[j][0]:
                Final.append((S[i],L[j]))
    return Final

我建议你将较小的列表放在第一个变量中,以便按照预期的顺序得到结果。

在测试时将这些字母作为字符串输入非常重要,就像我一样,否则它们可能被视为变量而代码将无法正常运行。

相关问题