2017-10-26 2 views
-1

In Python habe ich eine Liste voller Strings und ich möchte es die maximale Länge finden. Wenn einige Zeichenfolgen die gleiche Länge haben, werden beide gedruckt. Ich habe, dass aber es scheint nichtPython mehrere Liste max()

if len(in_list)>1: 
    while len(in_list) == a: 
    a = max(in_list, key=len) 
    print("Pair", pair,":", a) 
    in_list.remove(a) 

elif len(in_list)<1: 
    print("Pair", pair, ": No Common Sequence Found") 
+1

Was haben Sie versucht, mit dem zu tun 'während len (in_list) == a'? – user2357112

+0

Ich weiß nicht genau. Ich bin neu hier, aber ich versuche nur den Maximalwert einer Zeichenkette zu erhalten. Wenn zwei Elemente der Zeichenfolge die gleiche Länge haben, möchte ich, dass sie beide ausdruckt. Ist das sinnvoll? Oh, das Paar ist für eine Schleife, die ich gemacht habe – Ivonne

Antwort

0

eine Liste von Strings Gegeben:

maxlen = max(len(s) for s in strings) 

longest = filter(lambda s: len(s) == maxlen, strings) 

print(list(longest)) 

Aber das Effizienz ist mehr wegen drängen Dinge bis auf das C Niveau als durch:

# word strings -> string to create a three way tie: 

strings = "In python I have a list full of string and I want it to find the max by length".split() 

Wir prägnante und einigermaßen effizient gehen zu einem guten Algorithmus, wie wir die Liste der Strings ging zweimal wenn wir nur gehen müssen einmal:

longest = strings[:1] 
length = len(longest) 

for string in strings: 
    string_length = len(string) 

    if string_length >= length: 

     if string_length > length: 
      longest = [] 
      length = string_length 

     longest.append(string) 

print(longest) 

In einer kompilierten Sprache, dies ausführlicher Ansatz wahrscheinlich schneller sein würde, wie es die Dinge zu wiederholen vermeidet. Wenn/wenn wir etwas Eleganz und eine gewisse Geschwindigkeit wollen, die für ein Wörterbuch ruft:

counter = {} 

for string in strings: 
    counter.setdefault(len(string), []).append(string) 

longest = counter[max(counter)] 

print(longest) 

In allen drei Fällen erhalten wir zurück:

['python', 'string', 'length'] 
1

Da strings zu arbeiten:

maxes = [string for string in strings if len(string) == max(map(len, strings))] 

Mehr readably (und diese Methode viel effizienter ist, dank Schatten Ranger für den Hinweis, dass out):

maxlen = max(len(s) for s in strings) 
maxes = [string for string in strings if len(string) == maxlen] 

Dies gibt alle Zeichenfolgen zurück, wenn ihre Länge der Länge der längsten Zeichenfolge entspricht.

+1

Hinweis: Die "lesbarere Version" (die noch 'map' verwenden könnte, nur auf der vorherigen Zeile) ist auch * weit * effizienter; Inlining der 'max'-Berechnung in der bedingten würde es jedes Mal neu berechnen, Drehen von' O (n) 'arbeiten in' O (n ** 2) 'Arbeit. Python optimiert solche Dinge nicht für Sie. – ShadowRanger

+0

@ShadowRanger Das stimmt auch. Ich schreibe das nur als Randnotiz. Ich komme von PPCG, wo die meiste Zeit die Effizienz irrelevant ist;): P – HyperNeutrino