2016-03-31 16 views
0

Ich muss eine Liste von Listen erstellen (jede innere Liste hat n feste Elemente). Gerade jetzt, für n=3 Ich tue dies:Liste der Python kompakt erstellen

my_list = [] 
for x in range(min_inner max_inner + 1): 
    for y in range(min_outer, max_outer + 1): 
     for z in range(fixed_param): 
      my_list.append([x, y, z]) 

Als ich Liste Verständnis versucht, so etwas wie:

[[x,y,z] for x in range(1,4), y in range(1,4), z in range (4)]

ich einen Namen Fehler

NameError: name 'z' is not defined

Ist gibt es eine Liste Verständnis Weg, das zu tun? Bedenkt, dass n kann eine beliebige Anzahl (obwohl nicht unbedingt beliebig groß)

+0

Add für überall '[[x, y, z] für x im Bereich (1,4) für y im Bereich (1,4) für z im Bereich (4)]' ... –

+1

Beachten Sie, dass ein Verständnis macht Ihren Code nur horizontal statt vertikal. Traditionelle Schleifen sind nicht automatisch schlecht. – TigerhawkT3

Antwort

3

Sie müssen über Ihre Range-Objekte innerhalb der Liste verstehen zu verstehen.

[[x,y,z] for x in range(1,4) for y in range(1,4) for z in range (4)] 

Auch als prägnanter Art und Weise Sie itertools.product() zu erreichen das gleiche Ergebnis nutzen könnten:

from itertools import product  
list(product(range(1,4),range(1,4),range(4))) 

Beachten Sie, dass itertools.product() kehrt ein Iterator-Objekt, das ziemlich mehr (in Bezug auf die Speichernutzung) optimiert ist, als Listenverständnis, das eine Liste zurückgibt. Und wenn Sie nur über das Ergebnis iterieren möchten, müssen Sie das Ergebnis nicht in die Liste konvertieren. Andernfalls wird das Listenverständnis schneller ausgeführt.

+2

Darf '[liste (l) für l in Produkt (Bereich (1, 4), Bereich (1, 4), Bereich (1,4))] sein, wenn es wie bei der ersten Lösung als Liste von sein soll Listen –

+0

@AntonProtopopov In diesem Fall wäre das Listenverständnis besser. Aber wenn du meinst, die Tupel in eine Liste zu konvertieren, ist es auch ein guter Ansatz. – Kasramvd

+0

@Kasramvd die Verwendung von 'Produkt' von iter Tools zusammen mit der Umwandlung zu Liste von @Anton Protopopov passt zu meinem Bedarf! Danke euch beiden :) – okkhoy

Verwandte Themen