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?
Ausgabe der Zahl in zufälliger Reihenfolge aber mit Beeinflussung
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]
>>>
/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"
Code: Alles auswählen
while data.count() >0:
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.
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.
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)
-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)
Ich kann jetzt relativ einfach die zufälligen Werte ausgeben:
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?
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?")
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?
- __blackjack__
- User
- Beiträge: 13100
- 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).
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
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?
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?
@__blackjack__: Die Sequenz über verschachtelte Iteratoren anzulegen, um am Schluß dann doch eine Liste draus zu machen, finde ich jetzt mega-umständlich:
Ich hätte das, da es hier nur um eine kleine Datenmenge geht, direkt so geschrieben:
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:
und der Bytecode spiegelt das auch wider:
vs.
Manchmal ist KISS eben doch besser
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)
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
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?
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?