Seite 1 von 1

Verkürzung List Listcomprehension

Verfasst: Freitag 16. November 2018, 12:07
von ThorBenOdin
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

Re: Verkürzung List Listcomprehension

Verfasst: Freitag 16. November 2018, 12:50
von __deets__
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.

Re: Verkürzung List Listcomprehension

Verfasst: Freitag 16. November 2018, 15:41
von Sirius3
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.

Re: Verkürzung List Listcomprehension

Verfasst: Freitag 16. November 2018, 17:05
von snafu
Sehe ich ähnlich. Wenn man mehrere hintereinander geschaltete LCs benötigt, dann ist es manchmal einfacher, den "klassischen Weg" über append() zu nehmen.

Re: Verkürzung List Listcomprehension

Verfasst: Freitag 16. November 2018, 18:37
von __blackjack__
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.

Re: Verkürzung List Listcomprehension

Verfasst: Samstag 17. November 2018, 00:23
von __blackjack__
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. :-)