2016-10-19 7 views
-2

Ich habe mit diesem Problem seit zwei Tagen gekämpft und ich brauche Hilfe damit. Ich muss wiederholte Element in einer Liste von Listen list_of_list = [(a1, b1, c1), (a2, b2, c2), ..., (an, bn, cn)] finden, wo "a" und "b" -Elemente Integer sind und "c" -Elemente sind Floats.finden Sie wiederholte Element in der Liste der Liste Python

Also, zum Beispiel a1 == a2 oder a1 == bn, ich muss eine neue Liste mit den gesamten Listenelementen erstellen und ich muss dies für alle Listen (a, b, c) in der Liste der Listen durchlaufen. Um es anders auszudrücken, brauche ich alle Listen, die Elemente enthalten, die in mehr als einer Liste vorhanden sind. Ich muss nur "a" und "b" Elemente vergleichen, aber den zugehörigen Wert "c" in der endgültigen Liste erhalten.

Zum Beispiel:

list_of_list = [(1, 2, 4.99), (3, 6, 5.99), (1, 4, 3.00), (5, 1, 1.12), (7, 8, 1.99) ] 

desired_result=[(1, 2, 4.99), (1, 4, 3.00), (5, 1, 1.12)] 

ich viele Ideen versuchen ... aber nichts schön kam:

MI_network = [] #repeated elements list 
genesis = list(complete_net) #clon to work on 
genesis_next = list(genesis) #clon to remove elements in iterations 
genesis_next.remove(genesis_next[0]) 

while genesis_next != []: 
    for x in genesis: 
     if x[0] in genesis_next and x[1] not in genesis_next: 
      MI_network.append(x) 
     if x[0] not in genesis_next and x[1] in genesis_next: 
      MI_network.append(x) 
    genesis_next.remove(genesis_next[0]) 
+0

Does 'desired_result' das volle Ergebnis enthalten, oder nur ein Teil davon? – ASGM

+0

Sie müssen nur mit 'a1'-Wert vergleichen? –

+0

meinst du 'ai = aj' und' ai = bj' für i, j in (1, n)? –

Antwort

-1

Mit Ihrer Idee, können Sie dies versuchen:

MI_network = [] 
complete_net = [(1, 2, 4.99), (3, 6, 5.99), (1, 4, 3.00), (5, 1, 1.12), (7, 8, 1.99)] 
genesis = list(complete_net) 

while genesis != []: 
    for x in genesis: 
     for gen in genesis: 
      if x[0] in gen and x[1] not in gen: 
       if x[0] != gen[2] and x[1] != gen[2]: 
        if x not in MI_network: 
         MI_network.append(x) 
      elif x[0] not in gen and x[1] in gen: 
       if x[0] != gen[2] and x[1] != gen[2]: 
        if x not in MI_network: 
         MI_network.append(x) 
      elif x[0] not in gen and x[1] not in gen: 
       pass 
    genesis.remove(genesis[0]) 

print(MI_network) 
[(1, 2, 4.99), (1, 4, 3.0), (5, 1, 1.12)] 
-1

Und das ist, wie ich es tun würde, da ich keine Kenntnis von den collections.defaultdict() war .

list_of_list = [(1, 2, 4.99), (3, 6, 5.99), (1, 4, 3.00), (5, 1, 1.12), (7, 8, 1.99) ] 
results = [] 
for i_sub, subset in enumerate(list_of_list): 
# test if ai == aj 
    rest = list_of_list[:i_sub] + list_of_list[i_sub + 1:] 
    if any(subset[0] == subrest[0] for subrest in rest): 
     results.append(subset) 
# test if ai == bj 
    elif any(subset[0] == subrest[1] for subrest in rest): 
     results.append(subset) 
# test if bi == aj 
    elif any(subset[1] == subrest[0] for subrest in rest): 
     results.append(subset) 
print(results) # -> [(1, 2, 4.99), (1, 4, 3.0), (5, 1, 1.12)] 
+0

Danke, ich versuche diesen Code zu "kapern", weil ich ihn nicht 100% verstehe, aber im Moment funktioniert es wirklich gut. – K3rub

+0

Ich vergleiche diesen Ansatz mit @nicost und beide gaben mir unterschiedliche Ergebnisse. Obwohl Nicost gibt mir eine Liste, die dupliziert ist, aber dieses Skript erkennt keine solche Liste. – K3rub

Verwandte Themen