2016-03-22 11 views
0

I Liste von Listen, die wie folgt aussieht:Vergleichen erste Element in der Liste der Listen und schreiben Anzahl der wiederholten Werte

fails = [['55','35325235432','log'], ['55','22222222','log'], ['55','3232432','log2'], ['64','55','log3'], ['64','324234324','log2']]

I 1. Wert in der inneren Listen vergleichen müssen (hier ist es ‚55‘ und "64"), und wenn es in anderen Listen wiederholt wird, sollten diese wiederholten Listen gelöscht werden. Aber die Anzahl dieser wiederholten Werte sollte der ersten Liste hinzugefügt werden.

So an denen und es soll wie folgt aussieht:

shorten_fails = [['55','35325235432','log','3'], ['64','55','log3', '2']]

erste Liste mit eindeutigem Wert erhalten bleibt und die Anzahl der Listen mit diesem Wert an der ersten Position hinzugefügt wird.

Ich habe versucht, dies zu tun, indem Looping, aber am Ende mit mir fertig für in in in für ... und ich bin sicher, es muss einen einfacheren Weg zu tun, dass

+0

Ist dies immer eine zweistufige geschachtelte Liste? Und gibt es Fälle, in denen die erste Zahl anders als der erste Index erscheinen könnte? – Lafexlos

+0

Ja, immer 2-stufig, und es besteht die Möglichkeit, dass die erste Nummer in einem anderen Index erscheint (im obigen Beispiel gibt es diese Situation) – GohanP

Antwort

2

Sie Gebrauch von Counter und OrderedDict Funktionen des Python machen könnte wie folgt aussehen:

from collections import Counter, OrderedDict 

fails = [['55','35325235432','log'], ['55','22222222','log'], ['55','3232432','log2'], ['64','55','log3'], ['64','324234324','log2']] 

v1_counts = Counter(v[0] for v in fails) 
v1 = OrderedDict({v[0] : v for v in fails}) 
shorten_fails = [v + [v1_counts[k]] for k, v in v1.items()] 

print shorten_fails 

Dies würde die folgende Ausgabe angezeigt:

[['55', '3232432', 'log2', 3], ['64', '324234324', 'log2', 2]] 

v1_counts eine Zählung aller Werte hält , dh

Counter({'55': 3, '64': 2}) 

v1 hält den letzten Eintrag einer jeden Wert, d.h.

OrderedDict([('55', ['55', '3232432', 'log2']), ('64', ['64', '324234324', 'log2'])]) 

Schließlich shorten_fails indem die v1 Einträge und Anhängen des entsprechenden Zählerwert für jedes Element aufgebaut ist.

1
fails = [['55','35325235432','log'], ['55','22222222','log'], ['55','3232432','log2'], ['64','55','log3'], ['64','324234324','log2']] 

first_elems = set(fail[0] for fail in fails) 
new_fails = [] 
for fail in fails: 
    first = fail[0] 
    if first in first_elems: 
     new_fails.append(fail + [sum(f[0] == first for f in fails)]) 
     first_elems.remove(first) 

print(new_fails) 
# [['55', '35325235432', 'log', 3], ['64', '55', 'log3', 2]] 
1

Sie könnten ein Wörterbuch als Lookup-Tabelle verwenden, um die Indizes der Elemente speichern Sie bereits auf die verkürzte Liste hinzugefügt haben:

def shorten(fails): 
    sf, ind = [], {} 
    for el in fails: 
     if el[0] in ind: 
      sf[ind[el[0]]][-1] += 1 
     else: 
      ind[el[0]] = len(sf) 
      sf.append(el + [1]) 
    return sf 

>>> shorten(fails) 
[['55', '35325235432', 'log', 3], ['64', '55', 'log3', 2]] 

Wenn Sie wirklich möchten, dass der Zähler eine Zeichenkette ist, können Sie am Ende einfach das letzte Listenelement konvertieren.

+0

Ja, ich brauche es als String, aber es ist kein Problem, nur konvertiert. Es funktioniert super, danke! – GohanP

Verwandte Themen