Seite 2 von 2

Re: Python Feld auf Paarweise Verschieden Überprüfen

Verfasst: Samstag 9. Mai 2020, 19:41
von Sirius3
@__deets__: warum sollte es nicht ohne sortieren gehen?

Code: Alles auswählen

while A:
    a = A.pop()
    if a in A:
        print("doppelt", a)
Und eine Hash-Set selbst zu programmieren, wäre auch eine schöne Übung.

Re: Python Feld auf Paarweise Verschieden Überprüfen

Verfasst: Samstag 9. Mai 2020, 20:36
von __deets__
Stimmt. Wobei bubble sort ja nix anderes ist.

Re: Python Feld auf Paarweise Verschieden Überprüfen

Verfasst: Samstag 9. Mai 2020, 22:25
von Schlitzaaa
Okey also das macht ja das Bubblesort
Trommelwirbel sollte etwas besser aussehen ^^:

Code: Alles auswählen


import time

t1 = time.time()
n = len(A)

for phase in range(1,n,1):
     for i in range(0,n-phase):
          if A[i] > A[i+1]:
               hilf = A[i]
               A[i] = A[i+1]
               A[i+1] = hilf

t2 = time.time()

fehler = False
for i in range(len(A)-1):
     if A[i] > A[i+1]:
          fehler = True
          break

if fehler:
     print('Fehler')
else:
     print('alles Korrekt')

print(A)

print('Laufzeit = ', t2-t1)
So da vergleicht ja jz das Bubblesort jz weiß ich warum alle meinten ich müsse die nicht extra vergleichen
Das Problem allerdings jz ist folgendes:

Code: Alles auswählen

# Gegeben eine Liste von Zahlen. Bestimmen Sie ob alle Zahlen paarweise 
# verschieden sind ohne die Liste vorher zu sortieren.

Code: Alles auswählen

print('Verschieden' if len(A) == len(set(A)) else 'Nicht verschieden')

Darf ich nicht verwenden z.b.

Re: Python Feld auf Paarweise Verschieden Überprüfen

Verfasst: Sonntag 10. Mai 2020, 08:55
von __deets__
Wie das geht hat Sirius3 doch gezeigt. Eine Zahl nehmen, mit allen anderen Vergleichen, und danach entfernen. Weiter machen bis Liste leer, oder Dublette gefunden.

Re: Python Feld auf Paarweise Verschieden Überprüfen

Verfasst: Sonntag 10. Mai 2020, 09:40
von Sirius3
Hier als HashSet-Variante:

Code: Alles auswählen

hashset = [[] for _ in range(100)]
for a in A:
    bucket = hashset[a % len(hashset)]
    if a in bucket:
        print("Duplikat", a)
    else:
        bucket.append(a)

Re: Python Feld auf Paarweise Verschieden Überprüfen

Verfasst: Sonntag 10. Mai 2020, 10:13
von Schlitzaaa
__deets__ hat geschrieben: Sonntag 10. Mai 2020, 08:55 Wie das geht hat Sirius3 doch gezeigt. Eine Zahl nehmen, mit allen anderen Vergleichen, und danach entfernen. Weiter machen bis Liste leer, oder Dublette gefunden.
Ja schon klar aber pop() löscht den Eintrag doch dann oder bin ich jz falsch ?

Re: Python Feld auf Paarweise Verschieden Überprüfen

Verfasst: Sonntag 10. Mai 2020, 10:37
von __deets__
Ich w n, w s d e P s?

Re: Python Feld auf Paarweise Verschieden Überprüfen

Verfasst: Sonntag 10. Mai 2020, 12:29
von __blackjack__
@Schlitzaaa: Falls die ursprüngliche Liste nicht verändert werden darf, mach halt vorher eine Kopie und arbeite mit der weiter.

Alternativ könnte man auch über die Listenelemente und den Index iterieren (`enumerate()`) und die `index()`-Methode verwenden um zu ermitteln, ob das Element nach dem Index noch mal vorkommt. Ungetestet:

Code: Alles auswählen

def all_items_are_unique(A):
    for i, item in enumerate(A):
        try:
            A.index(item, i + 1)
        except ValueError:
            pass  # Nicht mehrfach vorhanden.
        else:
            return False
    return True

Re: Python Feld auf Paarweise Verschieden Überprüfen

Verfasst: Sonntag 10. Mai 2020, 12:42
von Schlitzaaa
__blackjack__ hat geschrieben: Sonntag 10. Mai 2020, 12:29 @Schlitzaaa: Falls die ursprüngliche Liste nicht verändert werden darf, man halt vorher eine Kopie und arbeite mit der weiter.

Alternativ könnte man auch über die Listenelemente und den Index iterieren (`enumerate()`) und die `index()`-Methode verwenden um zu ermitteln, ob das Element nach dem Index noch mal vorkommt. Ungetestet:

Code: Alles auswählen

def all_items_are_unique(A):
    for i, item in enumerate(A):
        try:
            A.index(item, i + 1)
        except ValueError:
            pass  # Nicht mehrfach vorhanden.
        else:
            return False
    return True
Danke schonmal dafür, habe jz mit pop() übernommen und bissl was dazu gemacht, das ding is ich weiß nicht was ich sonst noch nicht benutzen darf sonst hätte ich halt schon einige ideen...
nur wieder die basics benutzen is halt dann iwie (nicht schwer) komisch

Re: Python Feld auf Paarweise Verschieden Überprüfen

Verfasst: Sonntag 10. Mai 2020, 13:47
von __blackjack__
@Schlitzaaa: Ich denke so ein bisschen ein Problem bei der Aufgabe ist, ist dass das keine Python-Aufgabe ist, wir hier aber geneigt sind Python-Antworten zu geben.

Die Aufgabe soll zwar in Python(-Syntax) gelöst werden, aber es fängt schon mit der Formulierung der Aufgabe im Betreff an: „Python Feld …“ — „Feld“ ist eine übliche deutsche Übersetzung von „Array“. Python hat so etwas nicht als eingebauten Datentyp. Der normale Grunddatentyp für Sequenzen ist eine Liste und auf Listen sind Operationen definiert, was man aber anscheinend alles nicht verwenden soll. Stattdessen Indexherumgehampel was man aus „low level“-Programmiersprachen mit Arrays als eingebautem Datentyp kennt, was aber so gar kein idiomatisches Python ist.

Die offensichtliche, idiomatische Python-Lösung wäre das mit einem `set` zu lösen:

Code: Alles auswählen

def all_items_are_unique(A):
    return len(A) == len(set(A))
Wenn man eine Lösung mit sortierter Liste schreiben will, dann wäre das `sorted()`, `pairwise()`, und `all()`. `pairwise()` entweder ”selbst” geschrieben, nach dem Rezept in der Dokumentation vom `itertools`-Modul oder aus dem externen `more_itertools` importiert:

Code: Alles auswählen

def all_items_are_unique(A):
    return all(a != b for a, b in pairwise(sorted(A)))
Eine Gemeinsamkeit von beiden Lösungen ist das nicht-verwenden von irgendwelchen Indexzugriffen. Das ist in Python (und anderen Hochsprachen) nämlich eher selten, das man per Laufindex irgendwo zugreift. Man braucht Indexzugriffe zwar auch in Python, aber nicht wenn man linear durch die Elemente geht. Die sind für den wahlfreien Zugriff, also wenn der Programmierer nicht vorhersagen kann in welcher Reihenfolge auf die Elemente zugegriffen wird.

Die Aufgabenstellung scheint aber sehr auf Indexzugriffe fixiert zu sein. Also etwas was man beispielsweise von Aufgabenstellungen in C oder Pascal erwarten würde, wo das Array die zentrale sequentielle Datenstruktur ist, und man per Index zugreifen *muss*. Naja, fast, in C sind auch Zeiger üblich, was ja aber auch ein sehr „low level“-Konzept ist, was es in Python so nicht gibt.

Re: Python Feld auf Paarweise Verschieden Überprüfen

Verfasst: Sonntag 10. Mai 2020, 18:03
von Schlitzaaa
__blackjack__ hat geschrieben: Sonntag 10. Mai 2020, 13:47 @Schlitzaaa: Ich denke so ein bisschen ein Problem bei der Aufgabe ist, ist dass das keine Python-Aufgabe ist, wir hier aber geneigt sind Python-Antworten zu geben.

Die Aufgabe soll zwar in Python(-Syntax) gelöst werden, aber es fängt schon mit der Formulierung der Aufgabe im Betreff an: „Python Feld …“ — „Feld“ ist eine übliche deutsche Übersetzung von „Array“. Python hat so etwas nicht als eingebauten Datentyp. Der normale Grunddatentyp für Sequenzen ist eine Liste und auf Listen sind Operationen definiert, was man aber anscheinend alles nicht verwenden soll. Stattdessen Indexherumgehampel was man aus „low level“-Programmiersprachen mit Arrays als eingebautem Datentyp kennt, was aber so gar kein idiomatisches Python ist.

Die offensichtliche, idiomatische Python-Lösung wäre das mit einem `set` zu lösen:

Code: Alles auswählen

def all_items_are_unique(A):
    return len(A) == len(set(A))
Wenn man eine Lösung mit sortierter Liste schreiben will, dann wäre das `sorted()`, `pairwise()`, und `all()`. `pairwise()` entweder ”selbst” geschrieben, nach dem Rezept in der Dokumentation vom `itertools`-Modul oder aus dem externen `more_itertools` importiert:

Code: Alles auswählen

def all_items_are_unique(A):
    return all(a != b for a, b in pairwise(sorted(A)))
Eine Gemeinsamkeit von beiden Lösungen ist das nicht-verwenden von irgendwelchen Indexzugriffen. Das ist in Python (und anderen Hochsprachen) nämlich eher selten, das man per Laufindex irgendwo zugreift. Man braucht Indexzugriffe zwar auch in Python, aber nicht wenn man linear durch die Elemente geht. Die sind für den wahlfreien Zugriff, also wenn der Programmierer nicht vorhersagen kann in welcher Reihenfolge auf die Elemente zugegriffen wird.

Die Aufgabenstellung scheint aber sehr auf Indexzugriffe fixiert zu sein. Also etwas was man beispielsweise von Aufgabenstellungen in C oder Pascal erwarten würde, wo das Array die zentrale sequentielle Datenstruktur ist, und man per Index zugreifen *muss*. Naja, fast, in C sind auch Zeiger üblich, was ja aber auch ein sehr „low level“-Konzept ist, was es in Python so nicht gibt.
Ich weiß er sagt ja selbst das es eig. nicht Feld ist in Python, aber ich muss das tdem ohne hinbekommen
im prinzip müsste ich (so glaube ich) von wert zu wert gehen und ihn mit jedeem anderen wert vergleich was aber eig., und daher is das auch so kompliziert für mich, komplett useless ist