2016-07-14 51 views
1

我目前正在處理大量的清單(〜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])] 

我現在有它設置如下圖所示,其中al元組ist通過每個元組持有兩個具有匹配的第一個元素的列表返回。我很好,正在使用任何其他數據結構。我試圖使用一組元組,但遇到了問題,試圖找出如何更快地完成這項工作。

我的代碼比較列表這些兩個列表是目前這樣的:

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

當其中一個列表中有多個子列表以相同的值開始時會發生什麼?或者這是不可能的 –

+0

在這種情況下不會發生 - 第一個元素是MAC地址。 – KoolAid

+0

首先,'in'運算符不是檢查等式的正確方法,您應該使用'=='來達到這個目的。其次你爲什麼要把第一個項目轉換爲'str'? – Kasramvd

回答

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

你打敗了我:P – Brian

+0

由於某種原因,當爲大列表映射前綴到列表(by_prefix2)時,它會丟失大約60k條目 – KoolAid

+0

我的猜測是前綴不是唯一的,這導致它只保留最後一個值。 –

-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 

我建議你把小名單中的第一個變量,以獲得您所期望的順序結果。

像我一樣,在測試時輸入這些字母作爲字符串是非常重要的,否則它們可能會被視爲變量,代碼將無法正常運行。

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'])] 
+1

這比@Reut Sharabani的回答效率稍低,因爲你的理解是O(X * Y),而他會是O((X + Y)log(X * Y)),因爲集合數學和字典 – Brian