2016-07-14 1 views
1

Ich arbeite derzeit mit einer großen Liste von Listen (~ 280k Listen) und einer kleineren Liste (~ 3.5k Listen). Ich versuche, den ersten Index in der kleineren Liste mit dem ersten Index in der großen Liste effizient zu vergleichen. Wenn sie übereinstimmen, möchte ich beide Listen aus der kleinen und großen Liste mit einem übereinstimmenden ersten Index zurückgeben.Effizientes Vergleichen des ersten Eintrags in jeder Liste von zwei großen Listenlisten?

Zum Beispiel:

Große Liste 1:

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

Kleinere Liste 2:

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

Würde wieder

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

ich es zur Zeit eingerichtet haben, wie hier gezeigt , wo al Die Anzahl der Tupel wird mit jedem Tupel zurückgegeben, das die zwei Listen enthält, die ein übereinstimmendes erstes Element haben. Mir geht es gut, wenn andere Datenstrukturen verwendet werden. Ich habe versucht, eine Reihe von Tupeln zu verwenden, hatte aber Probleme, herauszufinden, wie es schneller geht als das, was ich bereits habe.

Mein Code auf diese beiden Listen von Listen zu vergleichen, ist dies derzeit:

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

Was passiert, wenn eine der Listen mehr als eine Unterliste hat, die mit dem gleichen Wert beginnt? Oder das ist nicht möglich –

+0

Das wird in diesem Fall nicht passieren - das erste Element ist eine MAC-Adresse. – KoolAid

+0

Zunächst ist der 'in'-Operator keine geeignete Methode, um die Gleichheit zu überprüfen, die Sie für dieses Ziel' == 'verwenden sollten. Zweitens, warum konvertierst du den ersten Gegenstand in 'str'? – Kasramvd

Antwort

4

Unter der Annahme Reihenfolge keine Rolle spielt, würde ich empfehlen, ein Wörterbuch mit Präfix (ein Zeichen), um Elemente zu erfassen und set Übereinstimmungen zu finden:

# 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

Sie schlagen mich zu ihm: P – Brian

+0

Aus irgendeinem Grund, wenn Prefix zu Liste (by_prefix2) für die große Liste Mapping, vermisst es etwa 60k Einträge – KoolAid

+0

Meine Vermutung ist, dass die Präfixe sind nicht eindeutig, was dazu führt, dass nur den letzten Wert. –

-1

Ich 2.7.11 Python tatsächlich verwenden, obwohl ich das denke, arbeiten kann.

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 

Ich schlage vor, Sie in den ersten Variablen, um die kleinere Liste zu setzen, die Ergebnisse in der Reihenfolge Sie erwartet zu bekommen.

Es ist sehr wichtig, dass Sie diese Buchstaben wie beim Testen als Strings eingeben, sonst könnten sie als Variablen betrachtet werden und der Code wird nicht korrekt ausgeführt.

0

Hier ist ein Einzeiler mit Liste Verständnis. Ich bin mir nicht sicher, wie effizient es ist.

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

Es ist ein bisschen weniger effizient als @Reut Sharabanis Antwort, weil Ihr Verständnis O (X * Y) ist, während sein O ((X + Y) log (X * Y)) wegen der Satzmathematik und des Wörterbuchs sein würde – Brian

Verwandte Themen