Mam teraz:
list1 = [1, 2, 3]
list2 = [4, 5, 6]
Chciałbym mieć:
[1, 2, 3]
+ + +
[4, 5, 6]
|| || ||
[5, 7, 9]
Po prostu elementarne dodanie dwóch list.
Z pewnością mogę powtórzyć te dwie listy, ale nie chcę tego robić.
Jaki jest najbardziej Pythoniczny sposób ?
python
list
elementwise-operations
Hazard Sibbs
źródło
źródło
Odpowiedzi:
Używaj
map
zoperator.add
:lub
zip
ze zrozumieniem listy:Porównanie czasowe:
źródło
map
będzie coraz ważniejszy. Python 2 straci oficjalne wsparcie za mniej niż 3 lata.Inni podali przykłady, jak to zrobić w czystym pythonie. Jeśli chcesz to zrobić z tablicami zawierającymi 100 000 elementów, powinieneś użyć numpy:
Wykonanie dodawania elementów jest teraz tak proste jak
tak jak w Matlabie.
Czas porównania z najszybszą wersją Ashwini:
To jest współczynnik 25 szybciej! Ale użyj tego, co pasuje do twojej sytuacji. W przypadku prostego programu prawdopodobnie nie chcesz instalować numpy, więc użyj standardowego Pythona (i uważam, że wersja Henry'ego jest najbardziej Pythoniczna). Jeśli jesteś w poważnej sytuacji kryzysowej, pozwól, aby
numpy
ciężkie podnoszenie. Dla maniaków prędkości: wydaje się, że numpy rozwiązanie jest szybsze od początkun = 8
.źródło
źródło
[sum(x) for x in zip(list1, list2)]
to ta sama odpowiedź, co nie? :)Jak opisują inni, szybkie i zajmujące mało miejsca rozwiązanie wykorzystuje numpy (np) z wbudowanymi możliwościami manipulowania wektorem:
1. Z Numpy
2. Z wbudowanymi
2.1 Lambda
Zauważ, że map () obsługuje wiele argumentów.
2.2 zip i zrozumienie listy
źródło
Z
numpy
mojej opinii jest łatwiejszy w użyciu :Wyniki:
Aby uzyskać szczegółowe informacje o parametrach, sprawdź tutaj: numpy.add
źródło
Być może „najbardziej pythonowy sposób” powinien obejmować obsługę przypadku, w którym lista1 i lista2 nie są tego samego rozmiaru. Zastosowanie niektórych z tych metod da ci cichą odpowiedź. Podejście numpy da ci znać, najprawdopodobniej z ValueError.
Przykład:
Którego wyniku możesz chcieć, jeśli miałbyś jakąś funkcję w twoim problemie?
źródło
zip_longest
z itertools zfillvalue
o0
.To jest proste z
numpy.add()
Zobacz dokument tutaj
Jeśli chcesz otrzymać listę python:
źródło
Będzie to działać na 2 lub więcej listach; iterowanie po liście list, ale przy użyciu dodawania numpy do radzenia sobie z elementami każdej listy
źródło
Być może jest to pytoniczne i nieco przydatne, jeśli masz nieznaną liczbę list i bez importowania czegokolwiek.
Dopóki listy są tej samej długości, możesz korzystać z poniższej funkcji.
W tym przypadku * args akceptuje zmienną liczbę argumentów listy (ale sumuje tylko taką samą liczbę elementów w każdym).
* Jest ponownie używane na zwróconej liście do rozpakowywania elementów na każdej z list.
Wynik:
Lub z 3 listami
Wynik:
źródło
Użyj mapy z funkcją lambda:
źródło
Nie ustaliłem czasu, ale podejrzewam, że byłoby to dość szybkie:
źródło
Jeśli potrzebujesz obsługiwać listy o różnych rozmiarach, nie martw się! Wspaniały moduł itertools obejmuje:
W Python 2
zip_longest
nazywa sięizip_longest
.Zobacz także tę odpowiednią odpowiedź i komentarz do innego pytania .
źródło
źródło
[a + b for (a, b) in zip(list1, list2)]
Chociaż rzeczywiste pytanie nie chce powtarzać się po liście, aby wygenerować wynik, ale wszystkie zaproponowane rozwiązania działają dokładnie tak, jak pod maską!
Aby odświeżyć: Nie można dodać dwóch wektorów bez spojrzenia na wszystkie elementy wektorowe. Zatem złożoność algorytmiczna większości z tych rozwiązań to Big-O (n). Gdzie n jest wymiarem wektora.
Zatem z algorytmicznego punktu widzenia użycie iteracyjnej pętli for do wygenerowania wynikowej listy jest logiczne i pythoniczne. Jednak dodatkowo ta metoda nie wiąże się z koniecznością nazywania lub importowania dodatkowej biblioteki.
Pokazane tu / omówione czasy są zależne od systemu i implementacji i nie mogą być wiarygodnym pomiarem do pomiaru wydajności operacji. W każdym razie duża złożoność O operacji dodawania wektora jest liniowa, co oznacza O (n).
źródło
źródło