Mam listę liczb, takich jak [1,2,3,4,5...]
, i chcę obliczyć, (1+2)/2
a dla drugiego, (2+3)/2
trzeciego
(3+4)/2
, i tak dalej. Jak mogę to zrobić?
Chciałbym zsumować pierwszą liczbę z drugą i podzielić ją przez 2, następnie zsumować drugą liczbę z trzecią i podzielić przez 2, i tak dalej.
Jak mogę zsumować listę liczb?
a = [1, 2, 3, 4, 5, ...]
Czy to jest:
b = sum(a)
print b
dostać jeden numer?
To mi nie działa.
Odpowiedzi:
Pytanie 1: Więc chcesz (element 0 + element 1) / 2, (element 1 + element 2) / 2, ... itd.
Tworzymy dwie listy: jedną z każdego elementu z wyjątkiem pierwszego i jedną z każdego elementu z wyjątkiem ostatniego. Następnie średnie, które chcemy, są średnimi dla każdej pary wziętej z dwóch list. Używamy
zip
par z dwóch list.Zakładam, że chcesz zobaczyć dziesiętne wyniki, mimo że wartości wejściowe są liczbami całkowitymi. Domyślnie Python dokonuje podziału na liczby całkowite: odrzuca resztę. Aby podzielić wszystko na wylot, musimy użyć liczb zmiennoprzecinkowych. Na szczęście podzielenie
2.0
liczby całkowitej przez liczbę zmiennoprzecinkową spowoduje utworzenie liczby zmiennoprzecinkowej, więc zamiast tego używamy po prostu naszego dzielnika2
.A zatem:
Pytanie 2:
Takie użycie
sum
powinno działać dobrze. Następujące prace:Nie musisz też przypisywać wszystkiego do zmiennej na każdym kroku.
print sum(a)
działa dobrze.Będziesz musiał sprecyzować dokładnie, co napisałeś i jak to nie działa.
źródło
my_list
jest definiowany tylko wtedy, gdy go zdefiniujesz. Miało to być miejsce dla dowolnej nazwy listy, z którą próbujesz pracować. Nie mogę zgadnąć, jak to nazwałeś.a
”.zip
zatrzymuje się, gdy osiągnie koniec krótszego argumentu,zip(my_list, my_list[1:])
wystarczy.Sumaryczna lista liczb:
Obliczanie połowy n i n - 1 (jeśli mam prawidłowy wzorzec), przy użyciu rozumienia listy :
Suma sąsiednich elementów, np. ((1 + 2) / 2) + ((2 + 3) / 2) + ... używając redukcji i lambda
źródło
x
ix - 1
; zamiast tego moglibyśmy odjąć 0,5.from functools import reduce
Pytanie 2: Aby podsumować listę liczb całkowitych:
Jeśli lista zawiera liczby całkowite jako ciągi znaków:
źródło
sum(i for i in a)
jest po prostu zbędny.sum(Decimal(i) for i in a)
=>sum(int(i) for i in a)
lubsum(map(int,a))
Możesz spróbować w ten sposób:
źródło
a[0:len(a)]
tworzy kopięa
, po co marnować procesor i pamięć? potemprint(sm)
działa również w Pythonie 2. Nie rozumiem, dlaczego ma tak wiele pozytywnych opinii w połowie 2017 roku ... ale dotyczy to większości odpowiedzi tutaj.Wygląda na to, że
sum
gdzieś został zdefiniowany w kodzie i zastępuje domyślną funkcję. Więc go usunąłem i problem został rozwiązany.źródło
Korzystanie z prostego
list-comprehension
isum
:źródło
[
i]
możesz po prostu przekazać wyrażenie generatorasum(i/2. for i in range(x))
sum(range(x)) / 2.
unika wszystkich podziałów, po prostu dziel na końcu.Wszystkie odpowiedzi wykazały podejście programowe i ogólne. Proponuję matematyczne podejście właściwe dla twojego przypadku. Może być szybszy, szczególnie w przypadku długich list. Działa, ponieważ twoja lista jest listą liczb naturalnych do
n
:Załóżmy, że mamy liczby naturalne
1, 2, 3, ..., 10
:Możesz użyć
sum
funkcji z listy:Możesz także użyć formuły
n*(n+1)/2
gdzien
jest wartością ostatniego elementu na liście (tutajnat_seq[-1]
:), aby uniknąć iteracji elementów:Aby wygenerować sekwencję
(1+2)/2, (2+3)/2, ..., (9+10)/2
, możesz użyć generatora i formuły(2*k-1)/2.
(zanotuj kropkę, aby wartości zmiennoprzecinkowe). Podczas generowania nowej listy musisz pominąć pierwszy element:Tutaj także możesz użyć
sum
funkcji z tej listy:Możesz jednak również użyć formuły
(((n*2+1)/2)**2-1)/2
, aby uniknąć iteracji elementów:źródło
Najprostszy sposób rozwiązania tego problemu:
źródło
Odpowiedź na to pytanie znajduje się tutaj
źródło
źródło
Generatory to prosty sposób na napisanie tego:
źródło
Ułatwmy dla początkującego: -
global
kluczowe pozwoli na przypisanie komunikatu zmiennej globalnej w ramach funkcji głównej bez tworzenia nowej zmiennej lokalnejTa koncepcja nazywa się Shadowing
Wyjścia = 15
źródło
Korzystanie z
pairwise
przepisu itertools :źródło
Krótkie i proste:
A oto jak to wygląda:
Ze względu na pewne głupoty w jaki Python obsługuje
map
ponad dwie listy, to trzeba obciąć listya[:-1]
. Działa więcej, niż można się spodziewać, jeśli używaszitertools.imap
:źródło
Tyle rozwiązań, ale wciąż brakuje mojego ulubionego:
tablica numpy nie różni się zbytnio od listy (w tym przypadku użycia), z tym wyjątkiem, że tablice można traktować jak liczby:
Gotowy!
wyjaśnienie
Fantazyjne wskaźniki oznaczają to:
[1:]
obejmują wszystkie elementy od 1 do końca (pomijając element 0) i[:-1]
są wszystkimi elementami oprócz ostatniego:Tak więc dodanie tych dwóch daje tablicę składającą się z elementów (1 + 2), (2 + 3) i tak dalej. Nie dlatego, że się dzielę
2.0
, nie2
dlatego , że inaczej Python uważa, że używasz tylko liczb całkowitych i generuje zaokrąglone wyniki liczb całkowitych.zaletą korzystania z numpy
Numpy może być znacznie szybsze niż pętle wokół list numerów. W zależności od tego, jak duża jest twoja lista, kilka rzędów wielkości szybciej. Poza tym jest o wiele mniej kodu i przynajmniej dla mnie jest łatwiejszy do odczytania. Staram się nawiązywać nawyk korzystania z numpy dla wszystkich grup liczb i jest to ogromna poprawa dla wszystkich pętli i pętli wewnątrz pętli, które w innym przypadku musiałbym zrobić.
źródło
Po prostu użyłbym lambda z mapą ()
źródło
Używam
while
pętli, aby uzyskać wynik:źródło
Zapętlaj elementy na liście i aktualizuj sumę w następujący sposób:
źródło
Dzięki Karlowi Knechtelowi mogłem zrozumieć twoje pytanie. Moja interpretacja:
Pierwsze pytanie za pomocą funkcji anonimowej (aka. Funkcja Lambda):
Drugie pytanie również za pomocą funkcji anonimowej (aka. Funkcji Lambda):
Oba pytania połączone w jednym wierszu kodu:
użyj tego, który najlepiej odpowiada Twoim potrzebom
źródło
Możesz również zrobić to samo za pomocą rekurencji:
Fragment kodu w języku Python:
źródło
Spróbuj użyć listy. Coś jak:
źródło
range(len(old_list) - 1)
), ale Pythoniści zazwyczaj marszczą brwi w kombinacji „zasięgu” i „len”. Następstwem tego „powinien być tylko jeden sposób” jest to, że „standardowa biblioteka umożliwia unikanie brzydkich rzeczy”. Pośrednia iteracja - iteracja po sekwencji liczb, abyś mógł użyć tych liczb do zindeksowania tego, co naprawdę chcesz iterować - jest brzydką rzeczą.W duchu itertools. Inspiracja parą przepisu.
Przykłady:
źródło
źródło
Prostym sposobem jest użycie permutacji iter_tools
Wynik to:
Pamiętaj, że kolejność ma znaczenie - co oznacza, że 1, 2, 7 jest również pokazane jako 2, 1, 7 i 7, 1, 2. Możesz to zmniejszyć za pomocą zestawu.
źródło
W Pythonie 3.8 można użyć nowego operatora przypisania
a
jest bieżącym odwołaniem do poprzedniej wartości na liście, stąd jest inicjowana do pierwszego elementu listy, a iteracja następuje na pozostałej części listy, aktualizująca
po użyciu w każdej iteracji.Aby uniknąć konieczności tworzenia kopii listy, należy użyć jawnego iteratora
my_list[1:]
.źródło
Spróbuj wykonać następujące czynności -
źródło
sum
funkcja nie różni się od wbudowanegosum
zachowania lub nazwy. Możesz usunąć definicję funkcji z odpowiedzi i nadal będzie działać.sum
. Otrzymasz ocenę A w teście poprawnej odpowiedzi na pytanie, ale odpowiedzi StackOverflow również muszą być przydatne dla osób przybywających na tę stronę, a duplikaty odpowiedzi nie są.