Inscription / Connexion Nouveau Sujet
Niveau Licence Maths 1e ann
Partager :

Somme 2 à 2 Python

Posté par
Theo92
09-02-22 à 22:21

Bonsoir,
je ne parviens pas à coder la somme deux à deux des termes d'une liste de nombre en Python.
Par exemple, si l'on a liste1 = [1,2,3,4,5,6,7,8], je voudrais obtenir une seconde liste liste2 = [3,7,11,15] à l'aide d'une boucle for
J'ai essayé pas mal de choses en vain.
Je vous remercie pour votre aide
Par exemple:
liste2 = []
for i in range(len(liste1)):
       liste2 = liste2 + liste1[i] + liste[i+1]
ne retourne pas ce que je souhaite.

Posté par
GBZM
re : Somme 2 à 2 Python 09-02-22 à 22:29

Bonjour,

Et si ta liste de départ n'est pas de longueur paire ?

Posté par
Theo92
re : Somme 2 à 2 Python 09-02-22 à 22:33

Bonsoir GBZM.
Il faut mettre une condition avec un if?

Posté par
Theo92
re : Somme 2 à 2 Python 09-02-22 à 22:37

Le problème que je ne parviens pas à contourner porte sur les indices i. Cela me retourne la somme du 1er et 2ème, du 2ème et du 3ème etc....
Or je souhaiterais [1er+2mè, 3ème+4éme,....]

Posté par
lafol Moderateur
re : Somme 2 à 2 Python 09-02-22 à 22:38

Bonjour
il n'y a pas moyen dans la boucle for de faire augmenter i de 2en 2 plutôt que de 1 en 1 ?

Posté par
Theo92
re : Somme 2 à 2 Python 09-02-22 à 22:56

Merci lafol,
voilà ce que j'ai fit et qui semble marcher

n = int(len(liste1) / 2)
liste2 = []
for i in range(n):
    liste2 += [(valeurs[2*i]+valeurs[2*i+1])]

Si cela vous semble correct?
Je vous souhaite une bonne soirée ainsi qu'à GBZM

Posté par
GBZM
re : Somme 2 à 2 Python 09-02-22 à 23:03

Tu peux définir ta fonction Sommedeuxadeux récursivement :

Si la longueur de L est inférieure ou égale à 1, Sommedeuxadeux(L)=L
Si la longueur de L est strictement plus grande que 1, Sommedeuxadeux (L) est la liste dont le premier terme est L[0]+L[1} et la suite est Sommedeuxadeux de la liste obtenue à partir de L en commençant à l'indice 2.

Je te laisse écrire proprement ça en python.

Posté par
Theo92
re : Somme 2 à 2 Python 09-02-22 à 23:16

C'est très clair. Merci beaucoup pour votre aide.

Posté par
carita
re : Somme 2 à 2 Python 10-02-22 à 13:00

bonjour à tous,
de passage

lafol @ 09-02-2022 à 22:38

Bonjour
il n'y a pas moyen dans la boucle for de faire augmenter i de 2en 2 plutôt que de 1 en 1 ?

oui, il est possible de préciser un "pas" différent de 1 (il peut même être négatif), en 3ème argument de in range.

exemple :
for j in range (0, 12, 3) :     ----  j prendra les valeurs 0, 3, 6, 9

Posté par
Theo92
re : Somme 2 à 2 Python 10-02-22 à 15:49

J'ai une dernière question, technique, que je n'arrive pas à résoudre même en lisant la doc matplotlib.

J'ai une liste de valeurs, issue d'un calcul d'une fonction y=f(x). Je voudrais représenter les éléments de cette liste par des points à l'aide de scatter. Seulement, je souhaite affecter une couleur différente pour les valeurs positives et négatives de y.
Si je trie la liste, et demande de dessiner le graphe, j'ai une erreur me disant que les listes crées - ypos et yneg- n'ont évidemment pas le même nombre d'éléments que la liste des x.

Je vous remercie pour votre aide.

Posté par
carita
re : Somme 2 à 2 Python 10-02-22 à 19:01

re-,
je ne connais pas bien matplotlib.
mais il me semble que le problème provient de la façon sont tu as "trié" ta liste.

à mon avis, il serait judicieux de scinder la liste en 2 : une pour les y négatifs (et sa liste de x correspondants, bien sûr !),
et une pour les y>0

puis tu appliques l'option   c="ta_couleur"  sur scatter pour chaque liste séparément

... enfin, si j'ai bien compris le truc...
montre ton bout de code si possible, on y verra plus clair.

je laisse la main si d'autres savent mieux

Posté par
Theo92
re : Somme 2 à 2 Python 10-02-22 à 22:16

Bonsoir Carita,
je vous remercie pour votre disponibilité. Voilà mon code.

Il s'agit du calcul de l'exposant de Lyapounov. et je définie les listes R et Y . Comment extraire les couples de valeurs et les trier?

Merci par avance.

Somme 2 à 2 Python

Posté par
Theo92
re : Somme 2 à 2 Python 10-02-22 à 22:17

En fait, je souhaite représenter les valeurs négatives en noir, et les valeurs positives en rouge. J'ai tracé la ligne des valeurs Y = 0.

Posté par
flight
re : Somme 2 à 2 Python 10-02-22 à 23:12

salut

pour ton probleme de liste un équivalent en vba   pour t'inspirer

Citation :
Sub liste()
Dim liste2() As Variant
liste1 = Array(1, 2, 3, 4, 5, 6, 7, 8)
k = 0
For i = 0 To UBound(liste1)
  If i Mod 2 = 0 Then
   ReDim Preserve liste2(0 To k)
   liste2(k) = Val(liste1(i)) + Val(liste1(i + 1))
   k = k + 1
  End If
Next
MsgBox Join(liste2, " ") ' retourne 3, 7 , 11 ,15
End Sub

Posté par
GBZM
re : Somme 2 à 2 Python 11-02-22 à 08:50

Tu devrais, je pense, créer une liste de couleurs, disons C, à partir de ta liste Y avec C[i] = "black" si Y[i]<0 et C[i]= "red" sinon, et utiliser l'option c=C dans scatter.

Posté par
carita
re : Somme 2 à 2 Python 11-02-22 à 08:56

bonjour

je ne suis pas fan de la façon dont tu as défini les fonctions f et prime...

pour les couleurs :
tu as 2 listes :
- pour les abscisses : un array, donc une liste indicée, par linspace
- pour les ordonnées : une liste par compréhension, complétée dans l'ordre des 2000 abscisses

je n'ai pas essayé, mais il me semble que tu peux jouer avec ces 2 listes X et Y et les indices,
pour les scinder en 4 listes, que j'appelle (abusivement, pour les x)
x_neg  et y_neg
x_pos et y_pos

---

il y a une autre façon de faire : dans le return,  renvoyer un couple plutôt que l'ordonnée seule :
return (r,l/n)

donc Y est ta liste de tous les points
reste à scinder, en utilisant les listes par compréhension munie d'une condition

par ex, pour les y<0 :
x_neg = [a for (a,b) in Y if b<=0]
y_neg = [b for (a,b) in Y if b<=0]

idem pour x_pos et y_pos

enfin, pour l'affichage :
plt.scatter(x_neg,y_neg, s=1,c='black')
et sa petite soeur en rouge pour les positifs

Somme 2 à 2 Python

Posté par
carita
re : Somme 2 à 2 Python 11-02-22 à 08:56

bonjourGBZM
désolée, je n'avais pas vu ta réponse :/

Posté par
Theo92
re : Somme 2 à 2 Python 11-02-22 à 11:00

Un grand merci à toutes et tous pour votre aide et vos pistes que je vais retravailler.
Merci Carita pour l'astuce sur le return de la fonction.
Je cherchais à faire cela,  en vain car je pouvais trier les mais sans pouvoir les associer à un x.

Bonne journée.

Posté par
carita
re : Somme 2 à 2 Python 11-02-22 à 11:15

de rien

... revois tes def pour les fonctions f et fprime.
à ma connaissance, il n'est pas très orthodoxe de les définir à l'intérieur de ta fonction lyapunov.

def f(r,x):  
    return r*(1-x)*x

def fprime(r,x):
    return r*(1-2*x)

def lyapunov(r,x_0,n):
    x=x_0
    l=fprime(r,x_0)
    etc.

----

pour faire suivre gentiment ta variable locale r, il te suffit de :
1)  la rajouter en argument dans tes 2 fonctions : par ex
def f(r,x):  
    return r*(1-x)*x

note : l'idéal est toutefois de changer le noms des variables arguments dans les fonctions

2) sans oublier de passer l'argument r  lors de l'appel des fonctions : par ex
x=f(r,x)
l=fprime(r,x_0)
etc.

bonne continuation.

Posté par
carita
re : Somme 2 à 2 Python 11-02-22 à 14:15

... juste pour le fun...

en reprenant l'idée du      return l/n    (ordonnée seule, sans le couple),
on peut récupérer nos 4 listes de plusieurs façons.

parmi les plus "synthétisées" (sans boucle....etc.), celle-ci fonctionne :
on récupère la liste des indices des y>0 (resp. y<=0) dans un tableau np.where(np.array(Y) > 0),
pour créer la liste des x correspondants.

y_pos = [b for b in Y if b>0]
x_pos = [R[i] for i in np.where(np.array(Y) > 0)[0]]

y_neg = [b for b in Y if b<=0]
x_neg = [R[i] for i in np.where(np.array(Y) <= 0)[0]]


si cela t'intéresse :



Vous devez être membre accéder à ce service...

Pas encore inscrit ?

1 compte par personne, multi-compte interdit !

Ou identifiez-vous :


Rester sur la page

Inscription gratuite

Fiches en rapport

parmi 1675 fiches de maths

Désolé, votre version d'Internet Explorer est plus que périmée ! Merci de le mettre à jour ou de télécharger Firefox ou Google Chrome pour utiliser le site. Votre ordinateur vous remerciera !