2017-01-26 5 views
-2

ich eine Liste von Elementen wie habe:Python - elegante Art und Weise Liste aller Kombinationen zu verwandeln

x = ['A, B', '2', '3', 'Jan, Feb'] 
# ^    ^
# comma separated single string 

Ich mag diese Liste in eine Liste von Listen mit allen Kombinationen der einzelnen Elemente zu transformieren das heißt durch Kommas getrennt, so dass es wie folgt aussieht:

[['A', '2', '3', 'Jan'], ['A', '2', '3', 'Feb'] 
['B', '2', '3', 'Jan'], ['B', '2', '3', 'Feb']] 

Was ist die elegante Möglichkeit, dies in integrierten Funktionen/Bibliotheken mit Python zu erreichen?

+2

Haben Sie irgendwelche Versuche bisher gemacht? – wim

+1

Bob, du hast einen guten Job gemacht und beschrieben, was du machen willst. Aber [SO] basiert nicht auf Beschreibungen, sondern auf Fragen und Antworten. Haben Sie eine spezifische Frage zu stellen? –

+0

Einige String Split und itertools.permutations? – doctorlove

Antwort

5

Sie können zunächst die Elemente der Liste verteilen basierend auf Komma , und dann itertools.product verwenden, um die gewünschte Liste zu erhalten, wie:

from itertools import product 
x = ['A, B', '2', '3', 'Jan, Feb'] 

new_list = list(product(*[i.split(', ') for i in x])) 

wo Inhalte new_list wird:

[('A', '2', '3', 'Jan'), 
('A', '2', '3', 'Feb'), 
('B', '2', '3', 'Jan'), 
('B', '2', '3', 'Feb')] 

Basierend auf Dan Ds Kommentar, unten ist der timeit Vergleich der Zwischenliste V/s Zwischengenerator Vergleich auf Python 2. Zwischenliste Ausdruck ist etwas schneller:

mquadri$ python -m timeit "from itertools import product; list(product(*(i.split(', ') for i in ['A, B', '2', '3', 'Jan, Feb'])))" 
100000 loops, best of 3: 4.83 usec per loop 

mquadri$ python -m timeit "from itertools import product; list(product(*[i.split(', ') for i in ['A, B', '2', '3', 'Jan, Feb']]))" 
100000 loops, best of 3: 3.78 usec per loop 
+0

Sie könnten vermeiden, eine unbrauchbare Liste zu erstellen, indem Sie den Generator-Ausdruck an den Splat übergeben: 'list (product (* (i.split (',') für i in x)))'. –

+0

@DanD. Die Zwischenliste wird in diesem Fall vergleichsweise schneller sein. Der Grund dafür ist, dass der Generatorausdruck hier nutzlos ist, denn um mit * product * verwendet zu werden, muss er komplett ausgewertet werden. –

+0

Editierte Antwort mit 'timeit' Vergleich der beiden –

Verwandte Themen