Python 有效地比较两个大列表中每个列表中的第一项?
我目前正在处理一个大型列表(~280k个列表)和一个较小的列表(~3.5k个列表)。我试图有效地比较较小列表中的第一个索引和较大列表中的第一个索引。如果它们匹配,我想从具有匹配的第一个索引的小列表和大列表返回两个列表 例如: 大名单1:Python 有效地比较两个大列表中每个列表中的第一项?,python,list,python-3.x,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])] 我目前的设置如
[[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
我实际上使用的是Python2.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
我建议您将较小的列表放在第一个变量中,以便按照您期望的顺序获得结果
在测试时输入这些字母作为字符串是非常重要的,就像我所做的那样,否则它们可能会被视为变量,代码将无法正常运行。假设顺序无关紧要,我强烈建议使用字典将前缀(一个字符)映射到项目,并设置
以查找匹配项:
# 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
这是一个使用列表理解的一行代码。不过,我不确定它的效率有多高
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'])]
当一个列表中有多个子列表以相同的值开头时会发生什么情况?或者这是不可能的在这种情况下不会发生的-第一个元素是MAC地址。首先,在
操作符中的不是检查平等性的正确方法。为此,您应该使用=
。其次,为什么要将第一项转换为str
?很好,我不知道为什么我没有使用==。str()是否会大大降低速度?列表的维度是否相同?如果是这样,您可以使用numpy
的扩展列表切片及其改进的执行速度来解决您比我更容易找到的列表问题:p出于某种原因,在为大列表将前缀映射到列表(通过前缀x2)时,它遗漏了大约60k个中心。我猜前缀不是唯一的,这导致它只保留最后一个值。是的,我错了。我感到困惑,因为没有找到共同的值,但这是因为我们正在比较的值中有几个字母大写了。谢谢这比@Reut Sharabani的答案效率稍低,因为你的理解是O(XY),而他的理解是O((X+Y)log(XY)),因为集合数学和字典