Ich habe eine Liste von Zahlen wie [1,2,3,4,5...]
, und ich möchte berechnen (1+2)/2
und für die zweite (2+3)/2
und die dritte
(3+4)/2
, und so weiter. Wie kann ich das machen?
Ich möchte die erste Zahl mit der zweiten summieren und durch 2 teilen, dann die zweite mit der dritten summieren und durch 2 teilen und so weiter.
Wie kann ich auch eine Liste von Zahlen summieren?
a = [1, 2, 3, 4, 5, ...]
Ist es:
b = sum(a)
print b
eine Nummer bekommen?
Das funktioniert bei mir nicht.
Antworten:
Frage 1: Sie möchten also (Element 0 + Element 1) / 2, (Element 1 + Element 2) / 2, ... usw.
Wir erstellen zwei Listen: eine von jedem Element außer dem ersten und eine von jedem Element außer dem letzten. Dann sind die Durchschnittswerte, die wir wollen, die Durchschnittswerte jedes Paares aus den beiden Listen. Wir verwenden
zip
Paare aus zwei Listen.Ich gehe davon aus, dass Sie im Ergebnis Dezimalstellen sehen möchten, obwohl Ihre Eingabewerte Ganzzahlen sind. Standardmäßig führt Python eine Ganzzahldivision durch: Der Rest wird verworfen. Um die Dinge vollständig zu teilen, müssen wir Gleitkommazahlen verwenden. Glücklicherweise wird durch Teilen eines Int durch einen Float ein Float erzeugt, sodass wir
2.0
stattdessen nur für unseren Divisor verwenden2
.Somit:
Frage 2:
Diese Verwendung von
sum
sollte gut funktionieren. Folgendes funktioniert:Außerdem müssen Sie nicht bei jedem Schritt auf dem Weg alles einer Variablen zuweisen.
print sum(a)
funktioniert gut.Sie müssen genauer wissen, was Sie geschrieben haben und wie es nicht funktioniert.
quelle
my_list
wird nur definiert, wenn Sie es definieren. Das sollte ein Platzhalter für alles sein, was Sie als Liste bezeichnet haben, mit der Sie arbeiten möchten. Ich kann nicht erraten, wie du es genannt hast.a
".zip
stoppt, sobald es das Ende des kürzeren Arguments erreicht,zip(my_list, my_list[1:])
ist ausreichend.Summenliste der Zahlen:
Berechnung der Hälfte von n und n - 1 (wenn ich das richtige Muster habe) unter Verwendung eines Listenverständnisses :
Summiere benachbarte Elemente, z. B. ((1 + 2) / 2) + ((2 + 3) / 2) + ... mit Reduce und Lambdas
quelle
x
und zu nehmenx - 1
; wir könnten stattdessen einfach 0,5 subtrahieren.from functools import reduce
Frage 2: Um eine Liste von ganzen Zahlen zusammenzufassen:
Wenn die Liste Ganzzahlen als Zeichenfolgen enthält:
quelle
sum(i for i in a)
ist nur überflüssig.sum(Decimal(i) for i in a)
=>sum(int(i) for i in a)
odersum(map(int,a))
Sie können dies folgendermaßen versuchen:
quelle
a[0:len(a)]
erstellt eine Kopie vona
, was ist der Sinn neben der Verschwendung von CPU und Speicher?print(sm)
funktioniert dann auch in Python 2. Ich verstehe nicht, warum dies Mitte 2017 so viele positive Stimmen hat ... aber es gilt für die meisten Antworten hier.Es scheint, dass dies
sum
irgendwo im Code definiert wurde und die Standardfunktion überschreibt. Also habe ich es gelöscht und das Problem wurde gelöst.quelle
Mit einem einfachen
list-comprehension
und demsum
:quelle
[
und]
können einfach den Generatorausdruck übergebensum(i/2. for i in range(x))
sum(range(x)) / 2.
vermeidet alle Unterteilungen, teilen Sie einfach am Ende.Alle Antworten zeigten einen programmatischen und allgemeinen Ansatz. Ich schlage einen für Ihren Fall spezifischen mathematischen Ansatz vor. Dies kann insbesondere bei langen Listen schneller sein. Es funktioniert, weil Ihre Liste eine Liste von natürlichen Zahlen bis zu ist
n
:Nehmen wir an, wir haben die natürlichen Zahlen
1, 2, 3, ..., 10
:Sie können die
sum
Funktion in einer Liste verwenden:Sie können auch die Formel verwenden,
n*(n+1)/2
bei dern
der Wert des letzten Elements in der Liste (hiernat_seq[-1]
:) angegeben ist, damit Sie nicht über Elemente iterieren:Um die Sequenz zu generieren
(1+2)/2, (2+3)/2, ..., (9+10)/2
, können Sie einen Generator und die Formel verwenden(2*k-1)/2.
(beachten Sie den Punkt, um die Werte als Gleitkommawerte zu setzen). Sie müssen das erste Element überspringen, wenn Sie die neue Liste erstellen:Auch hier können Sie die
sum
Funktion in dieser Liste verwenden:Sie können aber auch die Formel verwenden
(((n*2+1)/2)**2-1)/2
, um zu vermeiden, dass Elemente wiederholt werden:quelle
Der einfachste Weg, um dieses Problem zu lösen:
quelle
Diese Frage wurde beantwortet hier
quelle
quelle
Generatoren sind eine einfache Möglichkeit, dies zu schreiben:
quelle
Machen wir es Anfängern einfach: -
global
Schlüsselwort kann die globale Variablennachricht innerhalb der Hauptfunktion zugewiesen werden, ohne dass eine neue lokale Variable erstellt wirdDieses Konzept nennt man Shadowing
Ausgänge = 15
quelle
Verwenden des
pairwise
itertools-Rezepts :quelle
Kurz und einfach:
Und so sieht es aus:
Aufgrund der Dummheit, wie Python mit
map
mehr als zwei Listen umgeht, müssen Sie die Liste abschneidena[:-1]
. Es funktioniert besser als erwartet, wenn Sie Folgendes verwendenitertools.imap
:quelle
So viele Lösungen, aber mein Favorit fehlt noch:
Ein Numpy-Array unterscheidet sich nicht allzu sehr von einer Liste (in diesem Anwendungsfall), außer dass Sie Arrays wie Zahlen behandeln können:
Erledigt!
Erläuterung
Die ausgefallenen Indizes bedeuten Folgendes:
[1:]
Enthält alle Elemente von 1 bis zum Ende (wodurch Element 0 weggelassen wird) und[:-1]
sind alle Elemente außer dem letzten:Wenn Sie also diese beiden addieren, erhalten Sie ein Array, das aus Elementen (1 + 2), (2 + 3) usw. besteht. Nicht, dass ich durch teile
2.0
, nicht2
weil Python sonst glaubt, dass Sie nur Ganzzahlen verwenden, und gerundete Ganzzahlergebnisse erzeugt.Vorteil der Verwendung von Numpy
Numpy kann viel schneller sein als Schleifen um Zahlenlisten . Je nachdem, wie groß Ihre Liste ist, sind mehrere Größenordnungen schneller. Außerdem ist es viel weniger Code, und zumindest für mich ist es einfacher zu lesen. Ich versuche, es mir zur Gewohnheit zu machen, Numpy für alle Zahlengruppen zu verwenden, und es ist eine enorme Verbesserung für alle Schleifen und Schleifen innerhalb von Schleifen, die ich sonst hätte machen müssen.
quelle
Ich würde nur ein Lambda mit map () verwenden
quelle
Ich benutze eine
while
Schleife, um das Ergebnis zu erhalten:quelle
Durchlaufen Sie die Elemente in der Liste und aktualisieren Sie die Gesamtsumme wie folgt:
quelle
Dank Karl Knechtel konnte ich Ihre Frage verstehen. Meine Interpretation:
Erste Frage mit anonymer Funktion (auch bekannt als Lambda-Funktion):
Zweite Frage auch mit anonymer Funktion (auch bekannt als Lambda-Funktion):
Beide Fragen in einer einzigen Codezeile zusammengefasst:
Verwenden Sie diejenige, die Ihren Anforderungen am besten entspricht
quelle
Sie können dasselbe auch mithilfe der Rekursion tun:
Python-Snippet:
quelle
Versuchen Sie es mit einem Listenverständnis. Etwas wie:
quelle
range(len(old_list) - 1)
korrigieren - sollte es sein ), aber Pythonistas missbilligt im Allgemeinen die Kombination von 'range' und 'len'. Eine Folge von "Es sollte nur einen Weg geben, dies zu tun" ist "Die Standardbibliothek bietet Ihnen eine Möglichkeit, hässliche Dinge zu vermeiden". Indirekte Iteration - Iteration über eine Folge von Zahlen, damit Sie diese Zahlen verwenden können, um zu indizieren, worüber Sie wirklich iterieren möchten - ist eine hässliche Sache.Im Geiste von itertools. Inspiration aus dem paarweisen Rezept.
Beispiele:
quelle
quelle
Eine einfache Möglichkeit besteht darin, die Permutation iter_tools zu verwenden
Das Ergebnis ist:
Beachten Sie, dass die Reihenfolge wichtig ist - dh 1, 2, 7 wird auch als 2, 1, 7 und 7, 1, 2 angezeigt. Sie können dies mithilfe eines Satzes reduzieren.
quelle
In Python 3.8 kann der neue Zuweisungsoperator verwendet werden
a
ist eine laufende Referenz auf den vorherigen Wert in der Liste, daher wird sie mit dem ersten Element der Liste initialisiert und die Iteration erfolgt über den Rest der Liste und wird aktualisierta
nachdem sie in jeder Iteration verwendet wurde.Ein expliziter Iterator wird verwendet, um zu vermeiden, dass eine Kopie der Liste mit erstellt werden muss
my_list[1:]
.quelle
Versuche Folgendes -
quelle
sum
Funktion nicht vom integriertensum
Verhalten oder Namen. Sie könnten die Funktionsdefinition tatsächlich aus Ihrer Antwort löschen und es würde immer noch funktionieren.sum
. Bei einem Test zur korrekten Beantwortung der Frage erhalten Sie ein A, aber StackOverflow-Antworten müssen auch für Personen nützlich sein , die auf dieser Seite ankommen, und doppelte Antworten sind dies nicht.