wake-up-neo.net

Ersetzen eines Elements in der Liste ohne Listenverständnis, Schneiden oder Verwenden von [] s

Ich nehme diesen Online-Python-Kurs an und sie mögen die Studenten nicht, die Einlinienlösungen verwenden. Der Kurs akzeptiert keine Klammern für diese Lösung.

Ich habe das Problem bereits mit Listenverständnis gelöst, aber der Kurs lehnte meine Antwort ab.

Das Problem lautet:

Schreiben Sie mit index und anderen Listenmethoden eine Funktion replace(list, X, Y), die alle Vorkommen von X in list durch Y ersetzt. Wenn zum Beispiel L = [3, 1, 4, 1, 5, 9], replace(L, 1, 7) den Inhalt von L in [3, 7, 4, 7, 5, 9] ändert. Um diese Übung zu einer Herausforderung zu machen, dürfen Sie [] nicht verwenden.

Hinweis: Sie müssen kein return verwenden.

Das ist was ich bisher habe, aber es bricht wegen TypeError: 'int' Objekt ist nicht iterierbar.

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)

Dies war meine ursprüngliche Antwort, die jedoch abgelehnt wurde.

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)

Ideen zur Lösung meiner längeren Lösung?

6
StacyM

range() gibt eine einfache Liste von Ganzzahlen zurück, sodass Sie sie nicht in zwei Argumente entpacken können. Verwenden Sie enumerate, um Index- und Wertetupel abzurufen:

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)

Wenn Sie enumerate nicht verwenden dürfen, verwenden Sie einen einfachen alten Zähler:

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)

Schließlich könnten Sie das verwenden, was die Autoren der Frage wahrscheinlich gesucht haben (obwohl dies der ineffizienteste Ansatz ist, da die Liste bei jeder Iteration linear durchsucht wird):

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

Sie können dies auch versuchen (verwenden Sie []s oder enumerate() nicht wie erforderlich):

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

Dies ist wahrscheinlich nicht das, was der Auftrag von Ihnen verlangt, aber ich lasse es hier zu Lernzwecken. 

Hinweis: Sie sollten list nicht als Variablennamen verwenden, da dieser bereits von einer integrierten Funktion verwendet wird. Ich habe stattdessen l verwendet.

3
arshajii

Wenn enumerate nicht zulässig ist, können Sie auch eine while-Schleife verwenden.

>>> 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

Verwenden Sie nicht list als Namen, da dies zu starken Schmerzen führen wird.

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

stimme voll und ganz mit Asad Saeeduddin überein, aber der 1. Wert von i muss -1 sein, er wird dazu beitragen, das erste Objekt in der Liste zu ersetzen

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

Das hat für mich funktioniert. Ziemlich einfach. Wahrscheinlich eine Möglichkeit, dies mit weniger Zeilen zu tun, aber basierend auf dem, was bisher auf der Website gelehrt wurde, funktioniert dies.

def replace(L, X, Y):
   while X in L:
      i = L.index(X)
      L.insert(i, Y)
      L.remove(X)
0
aclark