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 Funktionreplace(list, X, Y)
, die alle Vorkommen vonX
inlist
durchY
ersetzt. Wenn zum BeispielL = [3, 1, 4, 1, 5, 9]
,replace(L, 1, 7)
den Inhalt vonL
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?
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)
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.
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]
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))
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)
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)