Noch mehr Listenprobleme xD

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
19mareut
User
Beiträge: 35
Registriert: Freitag 21. Februar 2020, 19:40

ich wollt mal wissen, wie ich das hinbekomme, aus einer Liste mit strings als Elementen ein neues Element hinzufügen möchte, aber das soll nur dann hinzugefügt werden, wenn es das elemnt darin noch nicht gibt. sonst wird das einfach aus dem speicher gelöscht und die nächste anweisung wird gemacht (jaja es is ne schleife, also der nächste schritt in der schleife aber ja...)
19mareut
User
Beiträge: 35
Registriert: Freitag 21. Februar 2020, 19:40

ah ja es sind verdammt viele stings (sowohl in den listen, als auch in die, die dazukommen) also obs nen befehl gibt oder ob ichs selber schreiben muss wollt ich eig nur wissen. wenns nen befehl gibt dann könntet ihr mir den pls verraten xD?
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

Bei diesen Posts ohne Satzzeichen fallen mit die Fußnägel aus.

Entweder musst du prüfen, ob das Element, das du einfügen möchtest, bereits in der Liste ist - oder du schaust dir statt einer Liste mal Set und dessen Eigenschaften an.
19mareut
User
Beiträge: 35
Registriert: Freitag 21. Februar 2020, 19:40

ja. ok. sorry. ich mach mehr satzzeichen, meinetwegen ^^. (tml) ja dankeschön ich google mal.
Benutzeravatar
snafu
User
Beiträge: 6867
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Die Lösung hängt auch davon ab, inwieweit die Reihenfolge der Elemente erhalten bleiben soll. Für Sets ist diese Reihenfolge nicht definiert, sodass man sich nicht darauf verlassen kann, an welcher Stelle im Set z.B. das erste Element aus dem Datensatz landen wird. Sofern einem das wichtig ist, muss man leider doch wieder eine Schleife schreiben.

Oder man nutzt in einem aktuellen Python den Umstand, das Wörterbücher diese Garantie der Reihenfolge mittlerweile geben. Insofern würde auch dies zum Erfolg führen:

Code: Alles auswählen

result = list(dict.fromkeys(values))
19mareut
User
Beiträge: 35
Registriert: Freitag 21. Februar 2020, 19:40

mir ist das eigentlich relativ egal ich wollte nur alle unterschiedlichen wörter da drinne stehen haben.
19mareut
User
Beiträge: 35
Registriert: Freitag 21. Februar 2020, 19:40

die reihenfolge mein ich sorry
19mareut
User
Beiträge: 35
Registriert: Freitag 21. Februar 2020, 19:40

ok ich schicks mal rüber:
also ich möchte ein Wort eingeben und dann alle möglichen anderen Wortkonstellationen haben die es gibt. also wenn ich 'ese' eingebe will ich rausbekommen 'ese','see','ees'. Dabei ist die Reihenfolge, in der er mir das ausgibt, egal. Der einfachheit halber lass ich die random Generieren und möchte nur testen lassen, ob es das Wort schon in der Liste gibt.
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

Um zu prüfen, ob ein Element in der Liste ist, gibt es den in-Operator. Effizienter sind Sets. Wenn Dir die Reihenfolge egal ist, dann packe gleich alles in Sets.

EDIT: die Aufgabenstellung gab es vor einigen Wochen hier schon einmal. Random ist wenig effektiv, weil Du ja auch nie weißt, ob Du alle Varianten hast. Der triviale Weg ist itertools.combinations.
Zuletzt geändert von Sirius3 am Mittwoch 16. September 2020, 08:10, insgesamt 1-mal geändert.
19mareut
User
Beiträge: 35
Registriert: Freitag 21. Februar 2020, 19:40

import random

x = 0

u = 0

nam = input('Lol:')

n = len(nam)

wort = []

if n != 0:

def fakultät(n):
if n == 0:
fak = 1
else:
fak = n * fakultät(n-1)
return fak

v = fakultät(n)

else:
v = 1

while len(wort) > u:

wort = wort + nam

u += 1

while v > x:

name = random.shuffle(wort)

result = list(dict.fromkeys(name))

print(result)

v = v + 1
19mareut
User
Beiträge: 35
Registriert: Freitag 21. Februar 2020, 19:40

das Lol war nur dazu da, um zu testen, ob das Programm überhaupt anläuft
Benutzeravatar
__blackjack__
User
Beiträge: 14052
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@19mareut: Und nun? Da bekommt man ja eine deutliche Fehlemeldung. Was ist an der nicht klar?

Bitte Fehler oder unerwartetes Verhalten beschreiben und Fehlermeldungen/Ausnahmen+Tracebacks 1:1 in den Beitrag kopieren.

Und Quelltext bitte in Code-Tags setzen, damit die in Python wichtige Einrückung sichtbar bleibt und aus Syntax wie `i` oder `u` in eckigen Klammern kein kursiv gesetzter oder unterstrichener Text im Beitrag wird.

Ansonsten gelten hier auch wieder die gleichen Anmerkungen wie bei anderem Code von Dir: Da sind unheimlich viele unnötige Leerzeilen drin und die Namen sind fast alle schlecht gewählt.

Wenn Du das Bedürfnis hast nahezu jede zweite Zeile frei zu lassen, dann ist das wohl eher ein Problem bei Dir mit der Anzeige. Such Dir einen Editor bei dem man den Abstand zwischen zwei Zeilen konfigurieren kann, wenn Du da mehr Platz brauchst/haben möchtest, und löse dieses optische Problem nicht durch Leerzeilen die anderen das lesen schwerer machen.

Die Definition der Fakultätsfunktion gehört auf Modulebene und nicht in das ``if``. Wobei man sich das auch komplett sparen kann, denn in der Standardbibliothek gibt es bereits `math.factorial()`.

Was man sich als nächstes sparen kann (auch mit der eigenen Fakultätsfunktion) ist das ``if``/``else`` an der Stelle, denn die Fakultät von 0 ist 1. Das ist also überhaupt kein Sonderfall den man hier einzeln behandeln muss.

Namen definiert man dort wo man sie dann auch verwendet, nicht alle am Anfang mal auf Vorrat.

Dann wären wir bei diesem Zwischenstand:

Code: Alles auswählen

#!/usr/bin/env python3
import math
import random


def main():
    text = input('text: ')

    u = 0
    wort = []
    while len(wort) > u:
        wort += text[u]
        u += 1

    v = math.factorial(len(text))
    x = 0
    while v > x:
        name = random.shuffle(wort)
        result = list(dict.fromkeys(name))
        print(result)
        v += 1


if __name__ == "__main__":
    main()
Schauen wir uns da die erste ``while``-Schleife an. Da kann man alles weglassen ausser dem ``wort = []`` denn die Schleife wird nie durchlaufen weil schon vor dem ersten Durchlauf die Länge von `wort` (0) nicht grösser als `u` (0) ist.

Bei der zweiten Schleife wissen wir das `v` mindestens 1 ist. Und `x` immer 0 bleibt. Womit das einfach eine Endlosschleife ist. Wofür weder `v` noch `x` irgendwie gebraucht werden. Wo dann auch die Fakultätsfunktion überhaupt nicht mehr gebraucht wird. Und der eingegebene Text wird dann auch für nichts mehr verwendet.

Neuer Zwischenstand:

Code: Alles auswählen

#!/usr/bin/env python3
import random


def main():
    wort = []
    while True:
        name = random.shuffle(wort)
        result = list(dict.fromkeys(name))
        print(result)


if __name__ == "__main__":
    main()
Nun macht ein Mischen einer garantiert immer leeren Liste überhaupt keinen Sinn, und auch das Ausfiltern von doppelten Elementen aus einer leeren Liste nicht. Bleibt am Ende effektiv das hier übrig:

Code: Alles auswählen

#!/usr/bin/env python3


def main():
    while True:
        print([])


if __name__ == "__main__":
    main()
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Antworten