2016-08-26 5 views
-1

So organisieren Sie Listenelemente? Angenommen, ich habe eine Liste l = ['a', 'b', 'c', 'd', 'e', ​​'f', 'g', 'h', 'i'] Anforderung ist zu erhalten, a, b, c zu einer Liste, d, e, f und g zu anderen, h, i zu einer anderen Implementierung list.CurrentOrganisieren von Elementen einer Liste

list l = ['a','b','c','d','e','f','g','h','i'] 
m= list() 
for i in l: 
    if (i.find("a")>=0) or (i.find("b")>=0) or (i.find("c")>=0): 
     m.append(i) 
     print m 

und um für die nächsten items.Is ist es eine bessere Logik Dies? Mit der aktuellen Implementierung ist Cyclomatic Complexity hoch.

+1

bitte posten a [ mcve]. Sie haben 'list l = [a, b, c, d, e, f, g, h, i]' mit fehlenden Anführungszeichen angegeben und Sie haben nicht genau erklärt, was Sie wollen. Ist die Eingabeliste sortiert? Sollen die Ausgabelisten auch sortiert werden? vage. –

+0

Entschuldigung für die fehlenden Anführungszeichen! .Ausgangsliste kann nicht sortiert werden, ich möchte nur Eingänge in Liste l zu verschiedenen Listen gruppieren. – PythonDev

+0

können Sie Ihre Frage dann bearbeiten. –

Antwort

2

In Ihrem Beispiel, müssen Sie nicht find in der Liste verwenden, weil:

  • Sie wirklich den Index nicht benötigen, so dass Sie nur if "a" in l
  • find oder sogar in in einem list verwenden könnten hat eine lineare (O (n)) Komplexität, so ist dies nicht optimal. Nicht auf einer kleinen Liste zu bemerken, aber mit einer Million Elemente ist es.

mit hat lineare Komplexität und Schleife auf die gesuchten Elemente anstelle der Liste selbst.

in einem set, Elemente sind Hashed (und müssen dann eindeutig sein), wodurch eine viel bessere Suchleistung (und fügen Sie die Leistung zu, aber das ist nicht der Punkt).

l= set(['a','b','c','d','e','f']) 
m=list() 
for i in ['a','b','z','c']: # I have introduced an extra element 
    if i in l: 
     m.append(i) 

print(m) 

Ergebnis:

['a', 'b', 'c'] 

Was lustig ist, ist der obige Code ist, dass es mit einem set arbeitet aber mit einem list weil in von allen Sammlungsobjekten gemeinsam genutzt wird. Nur die Leistung variiert. Sie könnten die erste Zeile durch l= ['a','b','c','d','e','f'] ersetzen es würde funktionieren, aber Sie werden schlechte Leistung bekommen (na ja, nicht für 6 Elemente, natürlich), genau wie Ihr Beispiel in der Frage.

Beweis für Leute, die immer noch an der Macht des set Objekts zweifeln, hier ist ein Test, um zu überprüfen, ob das Element in der Liste ist. Ich habe den schlechtesten Fall für list gewählt, aber kann mit einem anderen Wert gemacht werden.

import time 

data=range(1000000) 

start_time = time.time() 
for i in range(1,1000): 
    999999 in data 

print("list elapsed %f" % (time.time()-start_time)) 

data=set(data) 

start_time = time.time() 
for i in range(1,1000): 
    999999 in data 

print("set elapsed %f" % (time.time()-start_time)) 

Ergebnis:

list elapsed 17.284000 
set elapsed 0.000000 

nicht einmal in der Nähe :) und Sie können den gesuchten Wert zu reduzieren, der list Wert sinken (aber die set zeigt immer 0)

+0

was macht hier tun? Warum kann ich nicht nur eine Liste sein? – PythonDev

+0

Die Eingabe hat eine große Anzahl von Elementen. Ich habe nur 6 gewählt, um ein Beispiel zu geben. Ich kann nicht, wenn "a" in l für jedes Element! Ich weiß, dass die Komplexität hoch ist, wenn wir find/or verwenden. Ich möchte nur eine Lösung haben, um diese zu vermeiden! – PythonDev

+0

Wenn Sie eine Liste als Eingabe haben, müssen Sie ein Set mit denselben Elementen erstellen, um die dichotomische Suche verwenden zu können. –

Verwandte Themen