Ausgabe der Zahl in zufälliger Reihenfolge aber mit Beeinflussung

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
Lara2002
User
Beiträge: 15
Registriert: Montag 19. April 2021, 08:05

Moin,

ich hätte zum folgenden Vorhaben eine Frage. Eine habe ein Array oder eine Liste oder sonstwas wo ich meine Zahlen reinschreibe. Jede Zahl soll genau 5 mal wiedergegeben werden uns zwar in einer zufälligen Reihenfolge. Gibt es hierfür bereits fertige Methoden ? Ich könnte random benutzen um einen zufälligen Wert zu erhalten aber wie könnte ich dann dem System sagen, dass diese Zahl nach dem 5ten mal nicht mehr wiedergegeben werden soll?
__deets__
User
Beiträge: 14533
Registriert: Mittwoch 14. Oktober 2015, 14:29

Indem du dir merkst, dass du sie schon n mal ausgegeben hast. Zb in einem collections.Counter. Und dann so lange weiterwürfelst, bis eine noch auszugebende gefunden wird.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Wenn die Anzahl der Zahlen nicht so groß ist, dann kannst du sie einfach fünfmal in eine Liste schreiben. Die Liste mischt man dann zufällig und kann anschließend immer ein Element vom Ende wegnehmen.

Code: Alles auswählen

>>> data = [x for x in range(10) for _ in range(5)]
>>> data
[0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9]
>>> random.shuffle(data)
>>> data
[3, 9, 5, 5, 6, 5, 7, 5, 7, 0, 6, 4, 2, 3, 2, 3, 1, 0, 0, 2, 7, 9, 8, 5, 0, 8, 4, 7, 7, 3, 8, 2, 9, 1, 4, 8, 4, 0, 1, 1, 3, 9, 8, 9, 6, 6, 6, 1, 2, 4]
>>> print(data.pop())
4
>>> data
[3, 9, 5, 5, 6, 5, 7, 5, 7, 0, 6, 4, 2, 3, 2, 3, 1, 0, 0, 2, 7, 9, 8, 5, 0, 8, 4, 7, 7, 3, 8, 2, 9, 1, 4, 8, 4, 0, 1, 1, 3, 9, 8, 9, 6, 6, 6, 1, 2]
>>> 
Sirius3
User
Beiträge: 17746
Registriert: Sonntag 21. Oktober 2012, 17:20

Du nimmst Deine Liste, vervielfältigst sie 5 mal und mischst die Liste dann mit random.shuffle.

@/me: einfacher mit `data *= 5`.
__deets__
User
Beiträge: 14533
Registriert: Mittwoch 14. Oktober 2015, 14:29

Die Verfünffachung ist die bessere Lösung!
Lara2002
User
Beiträge: 15
Registriert: Montag 19. April 2021, 08:05

/me hat geschrieben: Montag 19. April 2021, 10:49 Wenn die Anzahl der Zahlen nicht so groß ist, dann kannst du sie einfach fünfmal in eine Liste schreiben. Die Liste mischt man dann zufällig und kann anschließend immer ein Element vom Ende wegnehmen.

Code: Alles auswählen

>>> data = [x for x in range(10) for _ in range(5)]
>>> data
[0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9]
>>> random.shuffle(data)
>>> data
[3, 9, 5, 5, 6, 5, 7, 5, 7, 0, 6, 4, 2, 3, 2, 3, 1, 0, 0, 2, 7, 9, 8, 5, 0, 8, 4, 7, 7, 3, 8, 2, 9, 1, 4, 8, 4, 0, 1, 1, 3, 9, 8, 9, 6, 6, 6, 1, 2, 4]
>>> print(data.pop())
4
>>> data
[3, 9, 5, 5, 6, 5, 7, 5, 7, 0, 6, 4, 2, 3, 2, 3, 1, 0, 0, 2, 7, 9, 8, 5, 0, 8, 4, 7, 7, 3, 8, 2, 9, 1, 4, 8, 4, 0, 1, 1, 3, 9, 8, 9, 6, 6, 6, 1, 2]
>>> 

Danke, das ist schon mal sehr vielversprechend!

Folgendes soll hinzugefügt werden:

-Es soll wie eine Ziehung sein, d.h. es soll irgendeine Taste getätigt werden z.B.

Code: Alles auswählen

keyboard.read_key() == "w"
, damit der nächste Wert übergeben wird und das so lange bis keine Werte mehr vorhanden sind. Wollte eine Schleife verwenden

Code: Alles auswählen

while data.count() >0:
funktioniert aber nicht. Jemand eine Idee?
Sirius3
User
Beiträge: 17746
Registriert: Sonntag 21. Oktober 2012, 17:20

Du willst nicht keyboard.read_key verwenden, denn das ist ein globaler System-Hook, der jeden Tastendruck registriert.

Funktioniert nicht, ist eine schlechte Fehlerbeschreibung. Wie sieht die Fehlermeldung exakt aus, und was könnte sie denn bedeuten?
Wenn Du Hilfe willst, wäre es auch gut, den kompletten Code zu sehen, und nicht nur irgendwelche Fragmente.
Lara2002
User
Beiträge: 15
Registriert: Montag 19. April 2021, 08:05

Ich probiere noch ein bisschen rum und poste dann den Code.

-Was heißt globaler System-Hook?
-Ist es im Prinzip richtig mit while Schleifen zu arbeiten?
-Kann data.count() mir nicht die Anzahl der Elemente ausgeben? Bei mir kommt nämlich : TypeError: list.count() takes exactly one argument (0 given)
Sirius3
User
Beiträge: 17746
Registriert: Sonntag 21. Oktober 2012, 17:20

Wenn Du nicht weißt, was keyboard tut, dann benutze es nicht.

Und was steht in der Dokumentation zu count?
Ich würde eine for-Schleife empfehlen.
Lara2002
User
Beiträge: 15
Registriert: Montag 19. April 2021, 08:05

Ich kann jetzt relativ einfach die zufälligen Werte ausgeben:

Code: Alles auswählen

data = [0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9]

random.shuffle(data)

gemischt = data

for x in gemischt:

    random_wert = x
    print(random_wert)
    eingabe = input("Eingabe?")
Versuche die ganze Zeit herauszufinden, wie ich die Daten in eine Excel Datei speichern kann, d.h.
erste Spalte
-random_wert
-alle Zahlen (die von der gemischten Liste)

zweite Spalte
-Eingabe
-alle Eingaben

Ich habe gedacht, ich versuche die Werte "Eingabe" in eine Liste zu schreiben. Das klappt nicht so wirklich. Die andere Liste mit "gemischt" habe ich bereits. Vielleicht kann man die beiden Listen dann irgendwie als zwei Dimensonale Liste zusammentun?
Benutzeravatar
__blackjack__
User
Beiträge: 13099
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Lara2002: Die beiden Zuweisungen ``gemischt = data`` und ``random_wert = x`` sind sinnfrei. Nenn die Dinge gleich richtig und gib nicht dem selben Objekt ohne Grund mehr als einen Namen.

Die Liste am Anfang per Hand hin zu schreiben ist fehleranfällig und nicht leicht zu ändern. Die würde ich programmatisch aus der Zahl der Werte und der Anzahl pro Wert erstellen. Dann kann man sich nicht verzählen, und auch beide Angaben einfach anpassen.

CSV-Dateien kann man mit dem `csv`-Modul aus der Standardbibliothek schreiben (und lesen).

Code: Alles auswählen

#!/usr/bin/env python3
import csv
import random
from itertools import chain, repeat


def main():
    values = list(chain.from_iterable(repeat(value, 5) for value in range(10)))
    random.shuffle(values)

    with open("test.csv", encoding="utf-8", newline="") as csv_file:
        writer = csv.writer(csv_file)
        writer.writerow(["Zufallswert", "Eingabe"])
        writer.writerows(
            [value, input(f"{value}\nEingabe? ")] for value in values
        )


if __name__ == "__main__":
    main()
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Lara2002
User
Beiträge: 15
Registriert: Montag 19. April 2021, 08:05

Danke für die Mühe!

Noch eine letzte Frage. Die CSV-Datei hat einen bestimmen Namen "test". Kann man den Namen auch flexibel halten, d.h. ich habe eine Variable (ist ein Integer) und dieser Wert soll auch der Name der Datei sein. Ist das möglich?
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

@__blackjack__: Die Sequenz über verschachtelte Iteratoren anzulegen, um am Schluß dann doch eine Liste draus zu machen, finde ich jetzt mega-umständlich:

Code: Alles auswählen

from itertools import chain, repeat

def seq2():
    return list(chain.from_iterable(repeat(value, 5) for value in range(10)))

Ich hätte das, da es hier nur um eine kleine Datenmenge geht, direkt so geschrieben:

Code: Alles auswählen

def seq():
    return list(range(10)) * 5

Da in Python aber nicht immer einfach erkennbar ist, was schneller läuft oder den besseren Bytecode erzeugt, habe ich aus Neugierde timeit drüberlaufen lassen:

Code: Alles auswählen

%timeit seq2()
3.26 µs ± 12.3 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

%timeit seq()
560 ns ± 12.4 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
und der Bytecode spiegelt das auch wider:

Code: Alles auswählen

dis.dis(seq2)
  4           0 LOAD_GLOBAL              0 (list)
              2 LOAD_GLOBAL              1 (chain)
              4 LOAD_METHOD              2 (from_iterable)
              6 LOAD_CONST               1 (<code object <genexpr> at 0x10836d870, file "<ipython-input-50-507b45561a08>", line 4>)
              8 LOAD_CONST               2 ('seq2.<locals>.<genexpr>')
             10 MAKE_FUNCTION            0
             12 LOAD_GLOBAL              3 (range)
             14 LOAD_CONST               3 (10)
             16 CALL_FUNCTION            1
             18 GET_ITER
             20 CALL_FUNCTION            1
             22 CALL_METHOD              1
             24 CALL_FUNCTION            1
             26 RETURN_VALUE

Disassembly of <code object <genexpr> at 0x10836d870, file "<ipython-input-50-507b45561a08>", line 4>:
  4           0 LOAD_FAST                0 (.0)
        >>    2 FOR_ITER                16 (to 20)
              4 STORE_FAST               1 (value)
              6 LOAD_GLOBAL              0 (repeat)
              8 LOAD_FAST                1 (value)
             10 LOAD_CONST               0 (5)
             12 CALL_FUNCTION            2
             14 YIELD_VALUE
             16 POP_TOP
             18 JUMP_ABSOLUTE            2
        >>   20 LOAD_CONST               1 (None)
             22 RETURN_VALUE
 

vs.

Code: Alles auswählen

dis.dis(seq)
  2           0 LOAD_GLOBAL              0 (list)
              2 LOAD_GLOBAL              1 (range)
              4 LOAD_CONST               1 (10)
              6 CALL_FUNCTION            1
              8 CALL_FUNCTION            1
             10 LOAD_CONST               2 (5)
             12 BINARY_MULTIPLY
             14 RETURN_VALUE


Manchmal ist KISS eben doch besser :)
Lara2002
User
Beiträge: 15
Registriert: Montag 19. April 2021, 08:05

Danke für die Hilfe!

Kann noch jemand meine vorherige Frage beantworten?

Die CSV-Datei hat einen bestimmen Namen "test". Kann man den Namen auch flexibel halten, d.h. ich habe eine Variable (ist ein Integer) und dieser Wert soll auch der Name der Datei sein. Ist das möglich?
Antworten