Verkürzung List Listcomprehension

Du hast eine Idee für ein Projekt?
Antworten
ThorBenOdin
User
Beiträge: 1
Registriert: Freitag 16. November 2018, 11:22

Freitag 16. November 2018, 12:07

Wunsch folgende Code verbessern:

Mein Code:
##############################################
n=3 # bis 20
tt0 = range(n,2*n)+range(2*n-2,n-1,-1)
print tt0
tt01 = [range(i) for i in tt0]
print tt01
print
tt02 = [(i, j) for i, j in enumerate(tt01)]
print tt02

tt1 = []
for i,k in tt02:
for j in k:
tt1 += [[i,j]]
print tt1
##########################################
Ergebnis:


[3, 4, 5, 4, 3]
[[0, 1, 2], [0, 1, 2, 3], [0, 1, 2, 3, 4], [0, 1, 2, 3], [0, 1, 2]]

[(0, [0, 1, 2]), (1, [0, 1, 2, 3]), (2, [0, 1, 2, 3, 4]), (3, [0, 1, 2, 3]), (4, [0, 1, 2])]
[[0, 0], [0, 1], [0, 2], [1, 0], [1, 1], [1, 2], [1, 3], [2, 0], [2, 1], [2, 2], [2, 3], [2, 4], [3, 0], [3, 1], [3, 2], [3, 3], [4, 0], [4, 1], [4, 2]]




Wenn möglich ein 1 Comprehension.

Wenn ich im falschen Thema bin bitte Hinweis !


f.G.
ThorBenOdin
__deets__
User
Beiträge: 3990
Registriert: Mittwoch 14. Oktober 2015, 14:29

Freitag 16. November 2018, 12:50

Bitte benutz die Code Tags, sonst ist das Skript nicht entzifferbar. Und warum glaubst du wird es durch eine list comprehension besser? Gute Variablennamen zb wurden deutlich mehr helfen. Und LCs verbessern auch zb keine Performance. Falls du das annehmen solltest.
Sirius3
User
Beiträge: 8791
Registriert: Sonntag 21. Oktober 2012, 17:20

Freitag 16. November 2018, 15:41

Ja klar kann man das in eine LC packen, ob das übersichtlicher wird, ist Geschmacksache. Erster Schritt wäre, die ganzen Zwischenschritte wegzulassen und alles (ohne LCs) in eine doppelte for-Schleife umzuwandeln; dabei benutzt man append, wenn man ein einzelnes Element an eine Liste anhängen will.
Benutzeravatar
snafu
User
Beiträge: 5631
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Freitag 16. November 2018, 17:05

Sehe ich ähnlich. Wenn man mehrere hintereinander geschaltete LCs benötigt, dann ist es manchmal einfacher, den "klassischen Weg" über append() zu nehmen.
shcol (Repo | Doc | PyPi)
Benutzeravatar
__blackjack__
User
Beiträge: 1565
Registriert: Samstag 2. Juni 2018, 10:21

Freitag 16. November 2018, 18:37

Wie kommt man denn auf so etwas: ``tt1 += [[i,j]]``? Das ist einfach ein ``tt1.append([i, j])`` statt das Paar noch einmal unnötig in eine Liste zu verpacken die keiner braucht.

Code: Alles auswählen

    **** COMMODORE 64 BASIC V2 ****
 64K RAM SYSTEM  38911 BASIC BYTES FREE
   CYBERPUNX RETRO REPLAY 64KB - 3.8P
READY.
█
Benutzeravatar
__blackjack__
User
Beiträge: 1565
Registriert: Samstag 2. Juni 2018, 10:21

Samstag 17. November 2018, 00:23

Ohne die ganzen Zwischenschritte könnte man es so schreiben:

Code: Alles auswählen

#!/usr/bin/env python3
from itertools import chain


def main():
    n = 3
    tt1 = [
        [i, j]
        for i, k in enumerate(
            chain(range(n, 2 * n), reversed(range(n, 2 * n - 1)))
        )
        for j in range(k)
    ]
    print(tt1)
    assert tt1 == [
        [0, 0], [0, 1], [0, 2], [1, 0], [1, 1], [1, 2], [1, 3], [2, 0],
        [2, 1], [2, 2], [2, 3], [2, 4], [3, 0], [3, 1], [3, 2], [3, 3],
        [4, 0], [4, 1], [4, 2]
    ]


if __name__ == '__main__':
    main()
Rückportierung zu Python 2 sei dem Leser überlassen. :-)

Code: Alles auswählen

    **** COMMODORE 64 BASIC V2 ****
 64K RAM SYSTEM  38911 BASIC BYTES FREE
   CYBERPUNX RETRO REPLAY 64KB - 3.8P
READY.
█
Antworten