Python Feld auf Paarweise Verschieden Überprüfen

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.
Sirius3
User
Beiträge: 17830
Registriert: Sonntag 21. Oktober 2012, 17:20

@__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.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Stimmt. Wobei bubble sort ja nix anderes ist.
Schlitzaaa
User
Beiträge: 34
Registriert: Donnerstag 11. Januar 2018, 10:47

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.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
Sirius3
User
Beiträge: 17830
Registriert: Sonntag 21. Oktober 2012, 17:20

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)
Schlitzaaa
User
Beiträge: 34
Registriert: Donnerstag 11. Januar 2018, 10:47

__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 ?
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich w n, w s d e P s?
Benutzeravatar
__blackjack__
User
Beiträge: 13242
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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
Zuletzt geändert von __blackjack__ am Sonntag 10. Mai 2020, 12:52, insgesamt 1-mal geändert.
Please call it what it is: copyright infringement, not piracy. Piracy takes place in international waters, and involves one or more of theft, murder, rape and kidnapping. Making an unauthorized copy of a piece of software is not piracy, it is an infringement of a government-granted monopoly.
Schlitzaaa
User
Beiträge: 34
Registriert: Donnerstag 11. Januar 2018, 10:47

__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
Benutzeravatar
__blackjack__
User
Beiträge: 13242
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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.
Please call it what it is: copyright infringement, not piracy. Piracy takes place in international waters, and involves one or more of theft, murder, rape and kidnapping. Making an unauthorized copy of a piece of software is not piracy, it is an infringement of a government-granted monopoly.
Schlitzaaa
User
Beiträge: 34
Registriert: Donnerstag 11. Januar 2018, 10:47

__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
Antworten