web-dev-qa-db-fra.com

Remplacer un élément d'une liste sans en comprendre la liste, trancher ou utiliser [] s

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 fonction replace(list, X, Y) qui remplace toutes les occurrences de X dans list par Y. Par exemple, si L = [3, 1, 4, 1, 5, 9], alors replace(L, 1, 7) changerait le contenu de L 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?

6
StacyM

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)
8
Asad Saeeduddin

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.

3
arshajii

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]
2
CT Zhu

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))
1
dansalmo

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)
0
ToanHD

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)
0
aclark