Fonction décalage

Lou -  
Furansujean Messages postés 58 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,

Je dois rédiger une fonction qui, à partir d'une liste L = [a,b,c], renvoie L = [b,c,a].
Voici le programme que j'ai rédigé :

def decalage(L) :
    return L.append(L.pop(0))


Or, quand j'exécute ma fonction dans le Shell, elle ne renvoie rien ...
Merci de votre aide !

Configuration: Macintosh / Safari 13.0.5
A voir également:

9 réponses

Furansujean Messages postés 58 Date d'inscription   Statut Membre Dernière intervention   5
 
Bonsoir,
La fonction
append
ne retourne rien, elle fait simplement une modification de la liste. Voilà pourquoi tu n'as rien en sortie.
0
Lou
 
D’accord merci beaucoup! Mais dans ce cas comment puis-je modifier mon programme pour avoir une liste en sortie ? J’ai tenté d’utiliser des deepcopy mais cela n’a pas marché..
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584 > Lou
 
comment appelles-tu cette fonction? que fais-tu du résultat? montre-nous ton programme complet.
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584 > Lou
 
as-tu compris ce que faisait append()?
quelle liste voudrais-tu en sortie?
0
Phil_1857 Messages postés 1872 Date d'inscription   Statut Membre Dernière intervention   168
 
Bonjour Lou,

pourquoi ne pas créer une 2eme liste ?

L2 = [L[k] for k in range(len(L)-1,-1, -1)]
0
Lou
 
D’accord j’ai compris , merci beaucoup pour l’ensemble de vos conseils !
0
Furansujean Messages postés 58 Date d'inscription   Statut Membre Dernière intervention   5
 
Bonjour Phil_1857,

Ce ne me semble pas une bonne idée. Vous indiquez une inversion de liste, alors que Lou souhaite faire une permutation circulaire. Son idée de départ me parait d'ailleurs pertinente.
0
Phil_1857 Messages postés 1872 Date d'inscription   Statut Membre Dernière intervention   168
 
Bonjour Furansujean,

Mais oui, tu as raison, quel blaireau je fais ! J'ai lu trop vite !

Allez hop, copie à revoir ! :-)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Furansujean Messages postés 58 Date d'inscription   Statut Membre Dernière intervention   5
 
Ça arrive, même aux meilleurs ! :-)
0
Phil_1857 Messages postés 1872 Date d'inscription   Statut Membre Dernière intervention   168
 
On peut décomposer, alors:

L = ['a','b','c']
s = L.pop(0)
L.append(s)


Là, on obtient bien L = b,c,a
0
Lou
 
Mais à ce stade , si je convertis ce script en fonction , je vais avoir le même problème : à la sortie je ne vais rien avoir de renvoyé car la liste aura été modifiée en place ?
En fait j’ai besoin que cette fonction me renvoie une liste (car je l’utilise ensuite dans un autre programme plus conséquent)
0
Furansujean Messages postés 58 Date d'inscription   Statut Membre Dernière intervention   5 > Lou
 
Bonsoir Lou,
que veux-tu en sortie ? ta liste modifiée ? tu peux donc faire un
return
de cette liste après que tu l'as modifiée.
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584
 
pourquoi pas
    L2= [L[k] for k in range(len(L))]
    L2.append(L2.pop(0))
, qui évite de modifier la liste de départ?
0
Phil_1857 Messages postés 1872 Date d'inscription   Statut Membre Dernière intervention   168
 
L = ['a','b','c']
def decalage(L):

	L2= [L[k] for k in range(len(L))]
	L2.append(L2.pop(0))
	return(L2)

L2 = decalage(L)
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584
 
c'est souvent une source de confusion d'utiliser les mêmes noms de variable dans et hors les fonctions.
0
Phil_1857 Messages postés 1872 Date d'inscription   Statut Membre Dernière intervention   168
 
C'est vrai !

import copy

def decalage(liste_a_decaler):
	''' Renvoie une liste qui est la permutation circulaire
	de celle passée en argument '''

	liste_decalee = copy.copy(liste_a_decaler)
	liste_decalee.append(liste_decalee.pop(0))

	return(liste_decalee)

L = ['a','b','c']
L2 = decalage(L)
print(L2) #imprime ['b', 'c', 'a']
0
Furansujean Messages postés 58 Date d'inscription   Statut Membre Dernière intervention   5
 
Bonsoir Lou,

La réponse de Phil_1857 répond-elle à ta question ? Si oui, je te propose de marquer le sujet comme "Résolu".

Remarques :
1. Si la liste
liste_a_decaler
est plate (ce qui est le cas de l'exemple donné) c'est-à-dire qu'elle ne contient pas de sous-liste, alors on peut se passer du module
copy
importé.
Pour une copie de liste on peut faire :
liste_decalee = liste_a_decaler.copy()

Il s'agit alors d'une "copie superficielle".

2. Je sors un peu du sujet, mais à noter : si la liste contient des sous-listes, du genre
[['a',1],['b'],'c',0.5]
alors il faut utiliser une "copie profonde" :
import copy
#...
liste_decalee = copy.deepcopy(liste_a_decaler)

La vidéo suivante explique très bien ce point : https://www.youtube.com/watch?v=I3dbeflpI-Q
0