Mam tę zagnieżdżoną listę:
l = [['40', '20', '10', '30'], ['20', '20', '20', '20', '20', '30', '20'], ['30', '20', '30', '50', '10', '30', '20', '20', '20'], ['100', '100'], ['100', '100', '100', '100', '100'], ['100', '100', '100', '100']]
Teraz chcę przekonwertować każdy element z listy na pływający. Moje rozwiązanie jest następujące:
newList = []
for x in l:
for y in x:
newList.append(float(y))
Ale czy można tego dokonać przy użyciu listy zagnieżdżonej, prawda?
co zrobiłem to:
[float(y) for y in x for x in l]
Ale wtedy wynikiem jest wiązka setek z sumą 2400.
każde rozwiązanie, wyjaśnienie byłoby bardzo mile widziane. Dzięki!
python
list
nested
list-comprehension
Boy Pasmo
źródło
źródło
Odpowiedzi:
Oto jak to zrobiłbyś ze zrozumieniem zagnieżdżonej listy:
To da ci listę list, podobną do tej, którą zacząłeś, z wyjątkiem pływaków zamiast ciągów. Jeśli chcesz mieć jedną płaską listę, skorzystaj
[float(y) for x in l for y in x]
.źródło
Oto jak przekonwertować zagnieżdżoną pętlę na zrozumienie listy zagnieżdżonej:
Oto jak działa obsługa list zagnieżdżonych:
W twoim przypadku będzie to coś takiego.
źródło
(f(x) for x in l)
miejscami druga linia ekwiwalentu pętli for po lewej stronie.źródło
Nie jestem pewien, jakie są pożądane dane wyjściowe, ale jeśli korzystasz ze zrozumienia listy, kolejność jest zgodna z kolejnością zagnieżdżonych pętli, które masz odwrotnie. Mam więc to, co myślę, że chcesz:
Zasada jest taka: używaj tej samej kolejności, w jakiej zapisujesz ją, zagnieżdżonej dla pętli.
źródło
Ponieważ trochę się tutaj spóźniłem, ale chciałem się podzielić tym, jak faktycznie działa interpretacja listy, a zwłaszcza zagnieżdżanie listy:
jest w rzeczywistości taki sam jak:
A teraz zrozumienie listy zagnieżdżonej:
jest taki sam jak;
wynik:
źródło
Jeśli nie podoba Ci się lista zagnieżdżona, możesz również skorzystać z funkcji mapy ,
źródło
>>> float_l = [map(float, nested_list) for nested_list in l]
[[<map at 0x47be9b0>], [<map at 0x47be2e8>], [<map at 0x47be4a8>], [<map at 0x47beeb8>], [<map at 0x484b048>], [<map at 0x484b0b8>]]
ale dodanie dodatkowego wywołania do listy działa zgodnie z oczekiwaniami:>>> float_l = [list(map(float, nested_list)) for nested_list in l]
python3
aby zwrócić generatory z niezrozumienia.Miałem podobny problem do rozwiązania, więc natknąłem się na to pytanie. Zrobiłem porównanie wydajności odpowiedzi Andrew Clarka i Narayana, którym chciałbym się podzielić.
Podstawowa różnica między dwiema odpowiedziami polega na tym, jak iterują się po wewnętrznych listach. Jeden z nich korzysta z wbudowanej mapy , podczas gdy inny używa listy. Funkcja mapy ma niewielką przewagę wydajności w porównaniu z równoważnym listowaniem, jeśli nie wymaga użycia lambda . Dlatego w kontekście tego pytania
map
powinno działać nieco lepiej niż zrozumienie listy.Zróbmy test porównawczy wydajności, aby sprawdzić, czy to rzeczywiście prawda. Użyłem Pythona w wersji 3.5.0 do wykonania wszystkich tych testów. W pierwszym zestawie testów chciałbym, aby liczba elementów na liście wynosiła 10, a liczba list od 10 do 100 000
W następnym zestawie testów chciałbym podnieść liczbę elementów na listy do 100 .
Zróbmy odważny krok i zmień liczbę elementów na listach na 1000
Na podstawie tych testów możemy stwierdzić, że
map
w tym przypadku ma on przewagę wydajności nad zrozumieniem listy. Ma to również zastosowanie, jeśli próbujesz przesyłać do jednegoint
lub jednegostr
. W przypadku małej liczby list z mniejszą liczbą elementów na listę różnica jest znikoma. W przypadku większych list z większą liczbą elementów na listę można chcieć użyćmap
zamiast ich interpretacji, ale zależy to całkowicie od potrzeb aplikacji.Jednak osobiście uważam, że zrozumienie listy jest bardziej czytelne i idiomatyczne niż
map
. Jest to de facto standard w Pythonie. Zwykle ludzie są bardziej biegli i wygodni (szczególnie początkujący) w posługiwaniu się listą niżmap
.źródło
Tak, możesz to zrobić za pomocą takiego kodu:
źródło
[float(y) for y in x for x in l]
to dałoby kilka setek z sumą 2400.Ten problem można rozwiązać bez użycia pętli, wystarczy do tego pojedynczy kod linii. Działa tu także mapa zagnieżdżona z funkcją lambda.
Lista wyjściowa wyglądałaby następująco:
źródło
Moim zdaniem najlepszym sposobem na to jest skorzystanie z
itertools
pakietu Pythona .źródło
Tak, możesz wykonać następujące czynności.
źródło
Można to osiągnąć przy użyciu listy:
źródło