Gibt es eine effiziente Möglichkeit, eine Liste von Tupeln mit einem Bereich zu erstellen?

8

Ich suche nach einer effizienten Möglichkeit, einen Zahlenbereich wie (20,24) mit einem anderen Objekt wie {'a': 'b'} zu kombinieren,

%Vor%

Wenn ich eine Liste mit Zahlen wie [20, 21, 22, 23] hätte, würde ich die Liste durchgehen. Aber hier habe ich eine Reihe von Zahlen. Es gibt also eine Möglichkeit, Bereichselemente eleganter in Tupel zu verpacken.

Hier ist mein Versuch, dies zu erreichen:

%Vor%

Ich möchte nur wissen, ob es dafür einen besseren Weg gibt.

    
nipunasudha 14.12.2017, 10:53
quelle

5 Antworten

10

Tatsächlich kann jede for-Schleife, die an eine leere Liste angehängt wird, in ein Listenverständnis umgewandelt werden.

%Vor%

Oder

%Vor%

Allerdings ! Beachte, dass du das bekommen hast -

%Vor%

Wo dasselbe Objekt mehrmals referenzkopiert wird. Dies ist ein Problem mit veränderbaren Objekten, denn wenn Sie ein Objekt ändern, spiegeln sie alle die Änderung wider. Aus diesem Grund würde ich empfehlen, bei jedem Schritt eine Kopie Ihrer Daten zu erstellen. Sie können entweder die eingebaute Funktion dict.copy oder eine Funktion aus dem Modul copy verwenden. Im ersten Fall wird nur eine flache Kopie erstellt. Wenn Sie also eine verschachtelte Struktur haben, ist das keine gute Idee.

Wie auch immer, so würde ich es machen -

%Vor%

Wenn Ihr Wörterbuch in der Struktur nicht komplex ist (zum Beispiel - {'a' : {'b' : 'c'}} ), funktioniert die Methode dict.copy , die ich oben erwähnt habe -

%Vor%     
cᴏʟᴅsᴘᴇᴇᴅ 14.12.2017, 11:01
quelle
6

Eine lustige Art ist, mit zip zu gehen, d. h.

%Vor%     
Dark 14.12.2017 11:02
quelle
4

itertools.repeat bietet eine saubere Möglichkeit, dies zu tun.

%Vor%

Beachten Sie, dass das Dictionary {'a':'b'} - oder jedes Objekt, das Sie repeat haben - in jedem der Tupel mit diesem Ansatz das gleiche Objekt im Speicher sein wird.

    
timgeb 14.12.2017 11:06
quelle
1

Benutze einfach ein Listenverständnis:

%Vor%

Oder Sie können map() auch hier verwenden:

%Vor%

Hinweis: In Ihrer Version verwenden Sie max und min als Variablennamen. Dies ist keine gute Idee, da sie bereits eingebaute Funktionen sind. Verwenden Sie stattdessen andere Variablennamen.

Zusätzlich, wie andere erwähnt haben, ist das Wörterbuch, das Sie wiederholen möchten, dasselbe Objekt im Speicher während aller Tupel. Sie können dieses Problem mit der informativen Antwort von @cᴏʟᴅsᴘᴇᴇᴅ beheben.

    
RoadRunner 14.12.2017 10:56
quelle
0

Es gibt immer einen besseren Weg, als an eine leere Liste anzuhängen. Sie können jeden Ausdruck des Formulars

konvertieren %Vor%

zu einem Listenverständnis

%Vor%

Das macht den Kern Ihres Codes ziemlich einfach.

    
David Z 14.12.2017 10:56
quelle

Tags und Links