Zastanawiam się, jaki jest najlepszy sposób na wyodrębnienie pierwszej pozycji z każdej podlisty na liście list i dołączenie jej do nowej listy. Więc jeśli mam:
lst = [[a,b,c], [1,2,3], [x,y,z]]
i chcę wyciągnąć a
, 1
a x
i utworzyć osobną listę z nich.
Próbowałem:
lst2.append(x[0] for x in lst)
Odpowiedzi:
Korzystanie ze rozumienia list :
źródło
Możesz użyć zip:
Lub Python 3, gdzie
zip
nie tworzy listy:Lub,
Lub (mój ulubiony) użyj numpy:
źródło
list
go najpierw lub użyjnext
. DziękiMiałem ten sam problem i zaciekawiło mnie działanie każdego rozwiązania.
Oto
%timeit
:Pierwszy numpy-way, transformujący tablicę:
W pełni natywny przy użyciu funkcji list (zgodnie z wyjaśnieniem @alecxe):
Inny natywny sposób użycia
zip
(jak wyjaśniono w @dawg):Drugi odrętwienie. Wyjaśnione również przez @dawg:
Zaskakująco (przynajmniej dla mnie) natywny sposób korzystania ze rozumienia list jest najszybszy i około 10 razy szybszy niż metoda numpy. Uruchomienie dwóch numpy-way bez finału
list
oszczędza około jednego µs, co nadal jest 10 -krotną różnicą.Zauważ, że kiedy otoczyłem każdy fragment kodu wezwaniem do
len
, aby upewnić się, że generatory działają do końca, czas pozostał taki sam.źródło
Python zawiera funkcję o nazwie itemgetter, która zwraca element pod określonym indeksem na liście:
Przekaż funkcji itemgetter () indeks elementu, który chcesz pobrać. Aby pobrać pierwszy element, możesz użyć itemgetter (0). Ważne jest, aby zrozumieć, że sam itemgetter (0) zwraca funkcję. Jeśli przekażesz listę do tej funkcji, otrzymasz konkretną pozycję:
Jest to przydatne, gdy łączysz ją z map (), która przyjmuje funkcję jako pierwszy argument i listę (lub dowolną inną iterowalną) jako drugi argument. Zwraca wynik wywołania funkcji na każdym obiekcie w iterowalnej:
Zauważ, że map () zwraca generator, więc wynik jest przekazywany do list () w celu uzyskania aktualnej listy. Podsumowując, twoje zadanie można wykonać w następujący sposób:
Jest to metoda alternatywna w stosunku do rozumienia list, a wybór metody zależy w dużym stopniu od kontekstu, czytelności i preferencji.
Więcej informacji: https://docs.python.org/3/library/operator.html#operator.itemgetter
źródło
Twój kod jest prawie poprawny. Jedynym problemem jest użycie rozumienia list.
Jeśli używasz like: (x [0] for x in lst), zwraca obiekt generatora. Jeśli użyjesz like: [x [0] for x in lst], zwraca listę.
Kiedy dołączasz wynik zrozumienia listy do listy, wynikiem zrozumienia listy jest pojedynczy element listy.
lst2 = [['a', 1, 'x']]
lst2 [0] = ['a', 1, 'x']
Daj mi znać, jeśli się mylę.
źródło
Wynik:
['a', 1, 'x']
źródło
Powiedziałeś, że masz istniejącą listę. Więc pójdę z tym.
W tej chwili dodajesz obiekt generatora do drugiej listy.
Ale prawdopodobnie chcesz, aby była to lista pierwszych pozycji
Teraz dołączyliśmy listę pierwszych pozycji do istniejącej listy. Jeśli chcesz dodać same elementy, a nie ich listę, do istniejących, użyj list.extend. W takim przypadku nie musimy się martwić o dodanie generatora, ponieważ rozszerzenie użyje tego generatora do dodania każdego elementu, który stamtąd otrzyma, w celu rozszerzenia bieżącej listy.
lub
https://docs.python.org/3.4/tutorial/datastructures.html#more-on-lists https://docs.python.org/3.4/tutorial/datastructures.html#list-comprehensions
źródło
append
w pytaniu jest przyczyną nieporozumień. Wygląda na to, że po prostu chce, aby część Twojego rozwiązania obejmowała zrozumienie listy.