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

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: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

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: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

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: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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

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.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

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. :-)
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Antworten