Je suis ce cours en ligne Python et ils n'aiment pas les étudiants qui utilisent des solutions à une ligne. Le cours n'acceptera pas les crochets pour cette solution.
J'ai déjà résolu le problème en utilisant la compréhension de liste, mais le cours a rejeté ma réponse.
Le problème se lit comme suit:
En utilisant
index
et d'autres méthodes de liste, écrivez une fonctionreplace(list, X, Y)
qui remplace toutes les occurrences deX
danslist
parY
. Par exemple, siL = [3, 1, 4, 1, 5, 9]
, alorsreplace(L, 1, 7)
changerait le contenu deL
en[3, 7, 4, 7, 5, 9]
. Pour faire de cet exercice un défi, vous n'êtes pas autorisé à utiliser[]
.Remarque: vous n'avez pas besoin d'utiliser return.
C’est ce que j’ai eu jusqu’à présent, mais cela se rompt à cause de TypeError: l’objet 'int' n’est pas itérable.
list = [3, 1, 4, 1, 5, 9]
def replace(list, X, Y):
while X in list:
for i,v in range(len(list)):
if v==1:
list.remove(1)
list.insert(i, 7)
replace(list, 1, 7)
C'était ma réponse initiale, mais elle a été rejetée.
list = [3, 1, 4, 1, 5, 9]
def replace(list, X, Y):
print([Y if v == X else v for v in list])
replace(list, 1, 7)
Des idées sur la façon de réparer ma solution plus longue?
range()
renvoie une liste plate d'entiers, vous ne pouvez donc pas la décompresser en deux arguments. Utilisez enumerate
pour obtenir des nuplets d'index et de valeur:
def replace(l, X, Y):
for i,v in enumerate(l):
if v == X:
l.pop(i)
l.insert(i, Y)
l = [3, 1, 4, 1, 5, 9]
replace(l, 1, 7)
Si vous n'êtes pas autorisé à utiliser enumerate
, utilisez un vieux compteur normal:
def replace(l, X, Y):
i = 0
for v in l:
if v == X:
l.pop(i)
l.insert(i, Y)
i += 1
l = [3, 1, 4, 1, 5, 9]
replace(list, 1, 7)
Enfin, vous pouvez utiliser ce que les auteurs de la question cherchaient probablement (même s’il s’agit de l’approche la plus inefficace, car elle effectue une recherche linéaire dans la liste à chaque itération):
def replace(l, X, Y):
for v in l:
i = l.index(v)
if v == X:
l.pop(i)
l.insert(i, Y)
l = [3, 1, 4, 1, 5, 9]
replace(l, 1, 7)
Vous pouvez également essayer ceci (sans utiliser []
s ou enumerate()
, comme requis):
for i in range(len(l)): # loop over indices
if l.__index__(i) == X: # i.e. l[i] == X
l.__setitem__(i, Y) # i.e. l[i] = Y
Ce n’est probablement pas ce que la mission vous demande de faire, mais je vais la laisser ici à des fins d’apprentissage.
Remarque: vous ne devez pas utiliser list
comme nom de variable car il est déjà utilisé par une fonction intégrée. J'ai utilisé l
ici à la place.
Si enumerate
n'est pas autorisé, vous pouvez également utiliser une boucle while
.
>>> def replace(L_in, old_v, new_v):
while old_v in L_in:
idx=L_in.index(old_v)
L_in.pop(idx)
L_in.insert(idx, new_v)
>>> L = [3, 1, 4, 1, 5, 9]
>>> replace(L, 1, 7)
>>> L
[3, 7, 4, 7, 5, 9]
N'utilisez pas list
comme nom, cela vous causera beaucoup de douleur.
def replace(my_list, X, Y):
while X in my_list:
my_list.insert(my_list.index(X), Y)
my_list.pop(my_list.index(X))
totalement d'accord avec Asad Saeeduddin mais, la 1ère valeur de i doit être -1, cela aidera à remplacer le 1er objet de la liste dans le besoin
def replace(l, X, Y):
i = -1
for v in l:
i += 1
if v == X:
l.pop(i) # remove item at given position (position number i)
l.insert(i, Y) # insert item Y at position i
l = [1, 1, 4, 1, 5, 9]
replace(l, 1, 7)
print(l)
Cela a fonctionné pour moi. Assez simple. Probablement une façon de le faire avec moins de lignes, mais basé sur ce qui a été enseigné sur le site Web jusqu'à présent, cela fonctionne.
def replace(L, X, Y):
while X in L:
i = L.index(X)
L.insert(i, Y)
L.remove(X)