J'ai une liste de nombres tels que [1,2,3,4,5...]
, et je veux calculer (1+2)/2
et pour le deuxième, (2+3)/2
et le troisième
(3+4)/2
, et ainsi de suite. Comment puis je faire ça?
Je voudrais additionner le premier nombre avec le second et le diviser par 2, puis additionner le deuxième avec le troisième et diviser par 2, et ainsi de suite.
Aussi, comment puis-je additionner une liste de nombres?
a = [1, 2, 3, 4, 5, ...]
Est-ce:
b = sum(a)
print b
obtenir un numéro?
Ça ne marche pas pour moi.
Réponses:
Question 1: Vous voulez donc (élément 0 + élément 1) / 2, (élément 1 + élément 2) / 2, ... etc.
Nous faisons deux listes: une de chaque élément sauf le premier, et une de chaque élément sauf le dernier. Ensuite, les moyennes que nous voulons sont les moyennes de chaque paire tirées des deux listes. Nous utilisons
zip
pour prendre des paires de deux listes.Je suppose que vous voulez voir des décimales dans le résultat, même si vos valeurs d'entrée sont des entiers. Par défaut, Python fait une division entière: il rejette le reste. Pour diviser complètement les choses, nous devons utiliser des nombres à virgule flottante. Heureusement, la division d'un entier par un flottant produira un flottant, nous utilisons donc simplement
2.0
notre diviseur au lieu de2
.Donc:
Question 2:
Cette utilisation de
sum
devrait fonctionner correctement. Les oeuvres suivantes:De plus, vous n'avez pas besoin de tout affecter à une variable à chaque étape du processus.
print sum(a)
fonctionne très bien.Vous devrez être plus précis sur exactement ce que vous avez écrit et comment cela ne fonctionne pas.
la source
my_list
n'est défini que si vous le définissez. C'était censé être un espace réservé pour tout ce que vous appelez la liste avec laquelle vous essayez de travailler. Je ne peux pas deviner comment tu l'as appelé.a
".zip
s'arrête une fois qu'il atteint la fin de l'argument le plus court, celazip(my_list, my_list[1:])
suffit.Liste des nombres:
Calcul de la moitié de n et n - 1 (si j'ai le modèle correct), en utilisant une compréhension de liste :
Additionner les éléments adjacents, par exemple ((1 + 2) / 2) + ((2 + 3) / 2) + ... en utilisant réduire et lambdas
la source
x
etx - 1
; nous pourrions simplement soustraire 0,5 à la place.from functools import reduce
Question 2: Pour résumer une liste d'entiers:
Si la liste contient des entiers sous forme de chaînes:
la source
sum(i for i in a)
est tout simplement redondant.sum(Decimal(i) for i in a)
=>sum(int(i) for i in a)
ousum(map(int,a))
Vous pouvez essayer de cette façon:
la source
a[0:len(a)]
crée une copie dea
, quel est le point à part le gaspillage de CPU et de mémoire? puisprint(sm)
travaille également en python 2. Je ne comprends pas pourquoi cela a tant de upvotes à la mi-2017 ... mais il applique à la plupart des réponses ici.Il semble que cela
sum
ait été défini quelque part dans le code et écrase la fonction par défaut. Je l'ai donc supprimé et le problème a été résolu.la source
En utilisant un simple
list-comprehension
et lesum
:la source
[
et]
, vous pouvez simplement passer l'expression du générateursum(i/2. for i in range(x))
sum(range(x)) / 2.
évite toutes les divisions, il suffit de diviser à la fin.Toutes les réponses ont montré une approche programmatique et générale. Je propose une approche mathématique spécifique à votre cas. Cela peut être plus rapide en particulier pour les longues listes. Cela fonctionne parce que votre liste est une liste de nombres naturels jusqu'à
n
:Supposons que nous ayons les nombres naturels
1, 2, 3, ..., 10
:Vous pouvez utiliser la
sum
fonction sur une liste:Vous pouvez également utiliser la formule
n*(n+1)/2
oùn
est la valeur du dernier élément de la liste (icinat_seq[-1]
:), afin d'éviter d'itérer sur les éléments:Pour générer la séquence,
(1+2)/2, (2+3)/2, ..., (9+10)/2
vous pouvez utiliser un générateur et la formule(2*k-1)/2.
(notez le point pour faire flotter les valeurs). Vous devez ignorer le premier élément lors de la génération de la nouvelle liste:Ici aussi, vous pouvez utiliser la
sum
fonction sur cette liste:Mais vous pouvez également utiliser la formule
(((n*2+1)/2)**2-1)/2
pour éviter d'itérer sur les éléments:la source
La façon la plus simple de résoudre ce problème:
la source
Cette question a été répondue ici
la source
la source
Les générateurs sont un moyen simple d'écrire ceci:
la source
Rendons-le facile pour les débutants: -
global
mot-clé permettra d'affecter le message de variable globale dans la fonction principale sans produire de nouvelle variable localeCe concept est appelé l' observation
Sorties = 15
la source
Utilisation de la
pairwise
recette itertools :la source
Court et simple:
Et voici à quoi ça ressemble:
En raison de la stupidité certaine dans la façon dont Python gère un
map
sur deux listes, vous ne devez tronquer la liste,a[:-1]
. Cela fonctionne mieux que ce à quoi vous vous attendez si vous utilisezitertools.imap
:la source
Tant de solutions, mais mon préféré manque toujours:
un tableau numpy n'est pas trop différent d'une liste (dans ce cas d'utilisation), sauf que vous pouvez traiter les tableaux comme des nombres:
Terminé!
explication
Les indices fantaisistes signifient ceci:
[1:]
inclut tous les éléments de 1 à la fin (omettant ainsi l'élément 0), et[:-1]
sont tous des éléments à l'exception du dernier:Donc, ajouter ces deux vous donne un tableau composé d'élémens (1 + 2), (2 + 3) et ainsi de suite. Non pas que je divise
2.0
, pas2
parce que sinon Python pense que vous n'utilisez que des entiers et produit des résultats entiers arrondis.avantage d'utiliser numpy
Numpy peut être beaucoup plus rapide que les boucles autour des listes de nombres. Selon la taille de votre liste, plusieurs ordres de grandeur plus rapidement. De plus, c'est beaucoup moins de code, et au moins pour moi, c'est plus facile à lire. J'essaie de prendre l'habitude d'utiliser numpy pour tous les groupes de nombres, et c'est une énorme amélioration pour toutes les boucles et lops-within-loops que j'aurais autrement dû faire.
la source
Je voudrais juste utiliser un lambda avec map ()
la source
J'utilise une
while
boucle pour obtenir le résultat:la source
Parcourez les éléments de la liste et mettez à jour le total comme ceci:
la source
Grâce à Karl Knechtel, j'ai pu comprendre votre question. Mon interprétation:
Première question en utilisant la fonction anonyme (aka. Fonction Lambda):
Deuxième question utilisant également la fonction anonyme (aka. Fonction Lambda):
Les deux questions combinées dans une seule ligne de code:
utilisez celui qui correspond le mieux à vos besoins
la source
Vous pouvez également faire de même en utilisant la récursivité:
Extrait Python:
la source
Essayez d'utiliser une compréhension de liste. Quelque chose comme:
la source
range(len(old_list) - 1)
), mais les Pythonistas désapprouvent généralement la combinaison de 'range' et 'len'. Un corollaire à «il ne devrait y avoir qu'une seule façon de le faire» est «la bibliothèque standard vous permet d'éviter les choses laides». L'itération indirecte - itérer sur une séquence de nombres, afin que vous puissiez utiliser ces nombres pour indexer ce que vous voulez vraiment répéter - est une chose laide.Dans l'esprit d'itertools. Inspiration de la recette par paire.
Exemples:
la source
la source
Un moyen simple consiste à utiliser la permutation iter_tools
Le résultat est:
Notez que l'ordre est important - ce qui signifie que 1, 2, 7 est également affiché comme 2, 1, 7 et 7, 1, 2. Vous pouvez réduire cela en utilisant un ensemble.
la source
Dans Python 3.8, le nouvel opérateur d'affectation peut être utilisé
a
est une référence courante à la valeur précédente de la liste, par conséquent, elle est initialisée au premier élément de la liste et l'itération se produit sur le reste de la liste, en mettant à joura
à après son utilisation à chaque itération.Un itérateur explicite est utilisé pour éviter d'avoir à créer une copie de la liste à l'aide de
my_list[1:]
.la source
Essayez ce qui suit -
la source
sum
fonction ne diffère pas dusum
comportement ou du nom intégré . Vous pouvez réellement supprimer la définition de fonction de votre réponse et cela fonctionnerait toujours.sum
. Vous obtiendrez un A sur un test pour répondre correctement à la question, mais les réponses StackOverflow doivent également être utiles aux personnes arrivant sur cette page, et les réponses en double ne le sont pas.