Liste werden Elemente entfernt

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
JojoEffekt
User
Beiträge: 8
Registriert: Freitag 28. Januar 2022, 21:26

Code: Alles auswählen

x = 10
L = []
quadr = int(round(x**0.5,0))
print("quad. zahl:",quadr)

for a in range(1,x+1,1):
    L.append(a)
print("Liste:",L)
aaa = L
print("Kopierte Liste:",aaa)

for i in range(2,quadr+2,1):
    for ii in range(0,len(L),1):
        if L[ii]%2 == 0:
            if L[ii] in aaa:
                print(True,L[ii])
                aaa.remove(L[ii])
                print(aaa,L)
print(aaa)
Hallo, der gegebene code soll von der Kopierten Liste "aaa" ein paar Elemente entfernen, allerdings wird der Originalen Liste "L" die gleichen Elemente entfernt, wie kann das sein? Es wird ja nur "aaa.remove(...)" aufgerufen. Gibt es irgendwelche Funktionen in Python die ich übersehen habe? oder wie kommt das zustande?
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Python macht keine Kopien. Das ist dieselbe Liste. Nur mit zwei Namen. Du musst eine neue Liste erzeugen. Zb mit einer List comprehension , die gleich deine Bedingung mit abhandelt.
Sirius3
User
Beiträge: 18279
Registriert: Sonntag 21. Oktober 2012, 17:20

Benutze keine Abkürzungen. `quadr` läßt vermuten, dass es sich um ein Quadrat handelt, dabei berechnest Du die Wurzel. Wenn Du `round` ohne 0 verwendest, erhältst Du automatisch ein `int`, ohne dass Du das noch extra umwandeln mußt.
Variablen initialisiert man erst, wenn man sie braucht, `L` wird aber drei Anweisungen zu früh eingeführt. Ein range-Objekt in eine Liste zu verwandeln, geht mit `list` deutlich einfacher. Die Default-Schrittweite ist schon 1, die muß man nicht extra angeben.
`L` ist dabei ein schlechter Variablenname, wie meist alle einbuchstabigen Variablennamen. Auch wenn man den selben Buchstaben mehrfach wiederholt, werden die Namen nicht besser.
Über einen Index iteriert man nicht, sondern über die Elemente der Liste direkt.

Code: Alles auswählen

x = 10
wurzel = round(x**0.5)
print("Wurzel:", wurzel)

zahlen = list(range(1, x+1))
print("Liste:", zahlen)

andere_zahlen = list(zahlen)
for i in range(2, wurzel+2):
    for zahl in zahlen:
        if zahl % 2 == 0:
            if zahl in andere_zahlen:
                print(zahl)
                andere_zahlen.remove(zahl)
print(andere_zahlen)
Jetzt ist natürlich die Frage, warum Du mehrfach die selbe Schleife durchgehst? Die äußere Schleife ist total unnötig. Und bei einem Durchlauf sind alle Zahlen in der Liste `andere_zahlen` enthalten, die if-Abfrage also unnötig.

Code: Alles auswählen

andere_zahlen = list(zahlen)
for zahl in zahlen:
    if zahl % 2 == 0:
        print(zahl)
        andere_zahlen.remove(zahl)
Etwas von einer Liste zu entfernen, ist aber total umständlich, besser wäre es, nur die Zahlen, die man haben möchte, der Liste hinzuzufügen.

Code: Alles auswählen

andere_zahlen = []
for zahl in zahlen:
    if zahl % 2 == 0:
        print(zahl)
    else:
        andere_zahlen.append(zahl)
print(andere_zahlen)
Natürlich ist die mathematische Operation dahinter so simple, dass man die Listen auch direkt erzeugen könnte:

Code: Alles auswählen

gerade_zahlen = range(2, x+1, 2)
ungerade_zahlen = list(range(1, x+1, 2))
for zahl in gerade_zahlen:
    print(zahl)
print(ungerade_zahlen)
Und schon hat man mit 4 Zeilen das selbe Ergebnis, wie in Deinem ursprünglichen Programm.
JojoEffekt
User
Beiträge: 8
Registriert: Freitag 28. Januar 2022, 21:26

danke für die antworten, hat mir sehr geholfen
Antworten