2016-03-22 17 views
0

ich die folgenden Liste von ListenPython - split Liste von Listen nach Wert

a = [["aa",1,3] 
    ["aa",3,3] 
    ["sdsd",1,3] 
    ["sdsd",6,0] 
    ["sdsd",2,5] 
    ["fffffff",1,3]] 

in die drei folgenden Listen von Listen aufteilen möchte:

a1 = [["aa",1,3] 
    ["aa",3,3]] 

a2 = [["sdsd",1,3] 
    ["sdsd",6,0] 
    ["sdsd",2,5]] 

a3 = [["fffffff",1,3]] 

, dass nach dem ersten Wert ist jeder Liste. Ich muss dies für eine Liste von Listen mit Tausenden von Elementen tun ... Wie kann ich es effizient machen?

+0

Was ist "effizient"? Warum ist es nicht effizient, alle Einträge der ursprünglichen Liste zu durchlaufen? –

Antwort

3

Sie sind besser dran, ein Wörterbuch zu machen. Wenn Sie wirklich eine Menge Variablen erstellen möchten, müssen Sie globals() verwenden, was nicht wirklich empfohlen wird.

a = [["aa",1,3] 
    ["aa",3,3] 
    ["sdsd",1,3] 
    ["sdsd",6,0] 
    ["sdsd",2,5] 
    ["fffffff",1,3]] 

d = {} 
for sub in a: 
    key = sub[0] 
    if key not in d: d[key] = [] 
    d[key].append(sub) 

ODER

import collections 

d = collections.defaultdict(list) 
for sub in a: 
    d[sub[0]].append(sub) 
+0

@zondo: Ich hatte einen großen Fehler drin. Fest. Vielen Dank :) – inspectorG4dget

0

erstellen ein Wörterbuch mit dem ersten Element als Schlüssel und Abgleichungslisten als Wert. Und Sie erhalten ein Wörterbuch, in dem der Wert jedes Schlüsselwertpaars eine Gruppe von Listen mit demselben ersten Element ist. Zum Beispiel

a = [["aa", 1, 3], 
    ["aa", 3, 3], 
    ["sdsd", 1, 3], 
    ["sdsd", 6, 0], 
    ["sdsd", 2, 5], 
    ["fffffff", 1, 3]] 
d = {} 
for e in a: 
    d[e[0]] = d.get(e[0]) or [] 
    d[e[0]].append(e) 

Und jetzt können Sie einfach die Listen separat erhalten,

a1 = d['aa'] 
a2 = d['sdsd'] 
0

A defaultdict funktioniert gut hier:

a = [["aa",1,3], 
["aa",3,3], 
["sdsd",1,3], 
["sdsd",6,0], 
["sdsd",2,5], 
["fffffff",1,3]] 
from collections import defaultdict 
d = defaultdict(list) 
for thing in a: 
    d[thing[0]] += thing, 

for separate_list in d.values(): 
    print separate_list 

Ausgabe

[['aa', 1, 3], ['aa', 3, 3]] 
[['sdsd', 1, 3], ['sdsd', 6, 0], ['sdsd', 2, 5]] 
[['fffffff', 1, 3]] 
1

Wenn Eingabe wird nach dem ersten Element sortiert:

from itertools import groupby 
from operator import itemgetter 

a = [["aa",1,3], 
    ["aa",3,3], 
    ["sdsd",1,3], 
    ["sdsd",6,0], 
    ["sdsd",2,5], 
    ["fffffff",1,3]] 

b = { k : list(v) for k, v in groupby(a, itemgetter(0))} 
Verwandte Themen