2012-05-13 15 views
5

Ich habe eine Python-Liste mit Elementen, die eine Liste mit einer Zeichenfolge aus einem Buchstaben und einer Zahl sind, und ich fragte mich, wie ich die Liste durch das Zeichen am Anfang trennen könnte die Zeichenfolge, ohne eine Anweisung für jedes Zeichen zu erstellen. Also möchte ich meine Liste in die Listen a, b und c aufteilen.Teilen einer Python-Liste durch ein Zeichen in jedem Element

mylist = [['a1'],['a2'],['c1'],['b1']] 
a = [['a1'],['a2']] 
b = [['b1']] 
c = [['c1']] 

Es ist wichtig, dass ich sie als eine Liste von Listen halten (auch wenn es nur ein einziges Element in jeder kleinen Liste).

Dank

Antwort

4

Dies funktioniert:

import itertools as it 

mylist = [['a1'],['a2'],['c1'],['b1']] 
keyfunc = lambda x: x[0][0] 

mylist = sorted(mylist, key=keyfunc) 
a, b, c = [list(g) for k, g in it.groupby(mylist, keyfunc)] 

Die Linie, wo sorted() verwendet wird, nur durch das Zeichen am Anfang der Zeichenfolge, wenn die Elemente in mylist nicht bereits sortiert notwendig ist.

EDIT:

Wie in den Kommentaren darauf hingewiesen, eine allgemeinere Lösung (eine, die nicht die Anzahl der Variablen nicht einschränkt auf nur drei) würde Wörterbuch Comprehensions mit werden (erhältlich in Python 2.7+) wie dies:

result_dict = {k: list(g) for k, g in it.groupby(mylist, keyfunc)} 

Nun ist die Antwort im Wörterbuch nach dem ersten Zeichen eingegeben wird:

result_dict['a'] 
> [['a1'],['a2']] 

result_dict['b'] 
> [['b1']] 

result_dict['c'] 
> [['c1']] 
+1

Schöne Lösung, aber vielleicht sollte klargestellt werden, dass der Code abstürzen würde, wenn ein "d1" in der Liste wäre. Das heißt, es wäre schöner, die letzte Zeile durch 'result_dict = {k: list (g) für k, g in it.groupby (mylist, keyfunc)}' 'zu ersetzen, die dann die Buchstaben als Schlüssel und die Listen als Items enthält. .. – deinonychusaur

+0

@deinonychusaur Danke für deinen Vorschlag! Ich habe meine Antwort aktualisiert. –

2

ein Wörterbuch verwenden arbeiten konnte

mylist = [['a1'],['a2'],['c1'],['b1']] 

from collections import defaultdict 

dicto = defaultdict(list) 

for ele in mylist: 
    dicto[ele[0][0]].append(ele) 

Ergebnis:

>>> dicto 
defaultdict(<type 'list'>, {'a': [['a1'], ['a2']], 'c': [['c1']], 'b': [['b1']]}) 

Es gibt nicht das genaue Ergebnis, das Sie für die Nachfrage wurden; jedoch ist es ziemlich einfach, eine Liste von Listen mit jedem Buchstaben zugeordnet zuzugreifen

>>> dicto['a'] 
[['a1'], ['a2']] 
+0

I +1 dieses, weil es mit einer beliebigen Anzahl von Startzeichen arbeitet, also sind Sie nicht auf 'a',' b', 'c' beschränkt. –

0

Sie können auch diese Teil-Listen erhalten, indem eine einfache Funktion:

def get_items(mylist, letter): 
    return [item for item in mylist if item[0][0] == letter] 

Der Ausdruck item[0][0] bedeutet einfach das bekommen erster Buchstabe des ersten Elements des aktuellen Artikels. Sie können dann die Funktion für jeden Buchstaben aufrufen:

a = get_items(mylist, 'a') 
b = get_items(mylist, 'b') 
c = get_items(mylist, 'c') 
Verwandte Themen