@pixewakb: Laufzeitverhalten in O-Notation ist O(n) mit n der Anzahl der Elemente und das wird man auch nicht besser hinbekommen, denn man muss ja jedes Element einmal betrachten, ob es den Wert 3 hat oder nicht.
Das ``while`` ist das falsche Mittel weil, wie Sirius3 ja auch schon sagte, die Schleife je nach dem was die Bedingung ergibt, entweder gar nicht oder genau einmal durchlaufen wird, was ein ``if`` ist und keine Schleife in der etwas wiederholt wird. Und das ``if`` ist überflüssig, weil es ein zusätzlicher Schritt ist, der keine Auswirkung auf das Ergebnis hat.
Beide bisherigen Lösungen bauen eine neue Datenstruktur auf, mit den gewünschten Werten, was die Vorlage ja nicht tut. Darum der Vollständigkeit halber noch eine Lösung, welche die vorhandene Datenstruktur verändert, mit weniger Indexzugriffen:
Code: Alles auswählen
for row in a:
for index, value in enumerate(row):
if value == 3:
row[index] = 1
Verändern von der Struktur kann effizienter sein als eine neue Datenstruktur aufzubauen, das kommt aber sehr auf die Umstände wie grösse der Struktur, die Anzahl der zu ersetzenden Werte, die Python-Implementierung, und so weiter an. Am Laufzeitverhalten in O-Notation ändert das aber nichts! „Pythonischer“ wäre IMHO eine neue Struktur zu erzeugen. Keine Seiteneffekte zu haben macht Code in der Regel einfacher nachvollziehbar, weil man sich keine Gedanken machen muss, ob noch irgendwelcher anderer Code auf die Struktur Zugriff hat, den eine Änderung vielleicht ”überraschen” könnte.
Wo man Veränderung eher erwarten würde, währen Numpy-Arrays. Da sähe der Code dann aber komplett ”schleifenfrei” einfach so aus:
Dort laufen natürlich dann intern Schleifen, und auch das hat eine Laufzeitverhalten von O(n). Was die Komplextitätsklasse angeht, sind all diese Varianten also gleichwertig.