Wpis z mikrobloga

Czy da się zrobić list comprehension, która tworzyłaby zagnieżdżone listy z liczbami w środku? Przy wykorzystaniu range() i/lub enumerate(). Początek, liczba wewnętrznych list i ilość elementów w każdej liście może być zmieniona w kodzie.
Czyli np. ustalamy (np. w range), że:

start=0, elementy=3, listy=3:
[ [0, 1, 2], [3, 4, 5], [6, 7, 8] ]

start=1, elementy=3, listy=4:
[ [1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12 ]

start=8, elementy=2, listy=2:
[ [8, 9], [10, 11] ]

#python #naukaprogramowania
  • 17
@scorpio18k
@ZabiliMiZolwia
@Rajtuz
Przy innym formatowaniu o już jest czytelniejsze. Ja z Blacka korzystam, i mi wypluł coś takiego
[
(list(range(start + i * elementy, start + (i + 1) * elementy)))
for i in range(listy)
] Czy jakiś podobnie, nie pamiętam na ten moment. Ale Blacka polecam każdemu, a nie jakieś autopepy czy inne autoflake'i
@Movet: Dalej nieczytelnie :p
@Rajtuz: Jak chcesz to trochę zoptymalizować to zamiast używać list wewnątrz list comprehension zostaw po prostu range. Wygenerowanie takiej listy będzie szybsze bo wyniki będą dopiero materializowane przy odczycie.
@ZabiliMiZolwia: Tak, bardzo fajna paczka.
Do różnego rodzaju iterable polecam też operator. Choćby głupie wyciągnięcie wartości ze słownika

list(map(itemggeter('klucz'), lista))
zamieni Ci

[{'klucz': 'wartosc1'}, {'klucz': 'wartosc2'}]
na

['wartosc1', 'wartosc2'}
itertools, more_itertools, functools i operator załatwiają mi większość operacji na iterable
@muevete: Niby fajne ale z drugiej strony zawsze jak miałem tworzyć jakiegoś potwora z list comprehension oznaczało to że zbyt mało czasu spędziłem na napisaniu zapytania do DB/zmuszenia ORM’a żeby dał mi to co chce