hi
rookie hier, sorry für die dumme frage, wenn ich von einer random liste, von zb 100 zahlen, alle zwischen 1 und 10, die anzahl an 5er oder 3er aufzählen möchte mit dem counter, wie gehe ich vor?
ich hab da mal was probiert, aber der counter bleibt bei 0 leider:
was mach ich falsch?
Danke Euch + VG
import random
counter1 = 0
counter2 = 0
counter3 = 0
counter4 = 0
counter5 = 0
counter6 = 0
counter7 = 0
counter8 = 0
counter9 = 0
counter10 = 0
listeX = []
for i in range(100):
listeX.append(random.randint(1,10))
if listeX == "1":
counter1 = counter1 + 1
if listeX == "2":
counter2 = counter2 + 1
if listeX == "3":
counter3 = counter3 + 1
if listeX == "4":
counter4 = counter4 + 1
if listeX == "5":
counter5 = counter5 + 1
if listeX == "6":
counter6 = counter6 + 1
if listeX == "7":
counter7 = counter7 + 1
if listeX == "8":
counter8 = counter8 + 1
if listeX == "9":
counter9 = counter9 + 1
if listeX == "10":
counter10 = counter10 + 1
print(counter1)
print(counter2)
print(counter3)
print(counter4)
print(counter5)
print(counter6)
print(counter7)
print(counter8)
print(counter9)
print(counter10)
Counter - Zählen von gewissen Elementen, zb die Zahlen "5"
Grundsätzlich: Wenn man anfängt Namen zu nummerieren, möchte man eigentlich eine passende Datenstruktur verwenden.
Fu bindest eine Liste an den Namen listeX (Namen werden in Python klein_mit_unterstrich geschrieben, außer Klassen (PascalCase) und Konstanten (KOMPLETT_GROSS)) und schaust dann, ob die Liste gleich der Zeichenkette "1" ist. Es ist aber eine Liste. Wie soll die gleich einer Zeichenkette sein? Wenn du einen Apfel in eine Tüte tust ist die Tüte trotzdem kein Apfel.
Auch die Zahl 1 wäre nicht gleich der Zeichenkette "1".
Schritt 1: werde die Doppelungen im Code los indem du passende Datenstrukturen verwendest.
Schritt 2: Du musst die Elemente der Liste mit den Werten vergleichen. Nicht die Liste an sich.
Schritt 3: Verwene List Comprehensions
Fu bindest eine Liste an den Namen listeX (Namen werden in Python klein_mit_unterstrich geschrieben, außer Klassen (PascalCase) und Konstanten (KOMPLETT_GROSS)) und schaust dann, ob die Liste gleich der Zeichenkette "1" ist. Es ist aber eine Liste. Wie soll die gleich einer Zeichenkette sein? Wenn du einen Apfel in eine Tüte tust ist die Tüte trotzdem kein Apfel.
Auch die Zahl 1 wäre nicht gleich der Zeichenkette "1".
Schritt 1: werde die Doppelungen im Code los indem du passende Datenstrukturen verwendest.
Schritt 2: Du musst die Elemente der Liste mit den Werten vergleichen. Nicht die Liste an sich.
Schritt 3: Verwene List Comprehensions
-
- User
- Beiträge: 6
- Registriert: Freitag 8. April 2022, 22:11
hi sparrow
danke schonmal für deine zeit.
ich meinte, mit diesem code hier habe ich eine "int" liste erstellt?
for i in range(100):
listeX.append(random.randint(1,10))
mit randint, werden die elemente einer liste doch integers?
ich verstehe aber, dass irgendwas nicht stimmt beim zählen, da die counter stehts auf null bleiben
if listeX == "1":
counter1 = counter1 + 1
ich versteh aber noch nicht, weshalb.
was genau fehlt denn, damit die counters "anspringen"?
danke sparrow
danke schonmal für deine zeit.
ich meinte, mit diesem code hier habe ich eine "int" liste erstellt?
for i in range(100):
listeX.append(random.randint(1,10))
mit randint, werden die elemente einer liste doch integers?
ich verstehe aber, dass irgendwas nicht stimmt beim zählen, da die counter stehts auf null bleiben
if listeX == "1":
counter1 = counter1 + 1
ich versteh aber noch nicht, weshalb.
was genau fehlt denn, damit die counters "anspringen"?
danke sparrow
Code solltest du grundsätzlich in Code-Tags setzen. Dir erscheinen automatisch wenn du den </> Button im vollständigen Editor drückst.
Schreib doch mal hinter jede Zeile, was du denkst, was sie tut. Es scheint ja mindestens eine zu geben, die das nicht tut.
Im interaktiven Interpreter, das ist das tolle an Python, kannst du jede einzelne Zeile ausprobieren und schauen, ob sie tut, was du möchtest.
Was genau ist dir aus meinem letzten Post unklar?
Schreib doch mal hinter jede Zeile, was du denkst, was sie tut. Es scheint ja mindestens eine zu geben, die das nicht tut.
Im interaktiven Interpreter, das ist das tolle an Python, kannst du jede einzelne Zeile ausprobieren und schauen, ob sie tut, was du möchtest.
Was genau ist dir aus meinem letzten Post unklar?
Es ist genau wie du gesagt hast. Du hast eine Liste erstellt und die Elemente dieser Liste sind Integer-Werte. Warum also erwartest du also, dass diese komplette Liste auf einmal gleich dem String "1" sein kann? Nicht mal irgendein Element der Liste kann "1" sein, da sich in der Liste ja Integer-Werte befinden und nicht Strings.
- __blackjack__
- User
- Beiträge: 14078
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
Das ganze mal an ein bisschen Code demonstriert:
Letztlich ist das mit 10 ``if``s und einzelnen Zählvariablen aber auch nicht wirklich sinnvoll gelöst. Am allereinfachsten wäre das mit `collections.Counter` aus der Standardbibliothek zu lösen. Dessen Funktionalität kann man sich mit ein bisschen Code und einem Wörterbuch nachprogrammieren. Entweder mit `collections.defaultdict`, oder wenn man wirklich alles selbst machen will, mit einem normalen Wörterbuch. Dort sollte man sich dann die `get()`-Methode anschauen.
In diesem Fall könnte man statt einem Wörterbuch auch eine Liste zum Zählen verwenden. Entweder eine mit 11 Elementen, wo man auch die 0 mit zählt, auch wenn die nicht vorkommt in den Eingabedaten, oder eine mit 10 Elementen wo man dann den Index beim Zugriff entsprechend anpassen muss.
Code: Alles auswählen
In [103]: numbers = [1, 2, 3]
In [104]: numbers == "1"
Out[104]: False
In [105]: numbers[0]
Out[105]: 1
In [106]: numbers[0] == "1"
Out[106]: False
In [107]: type(numbers[0]), type("1")
Out[107]: (int, str)
In diesem Fall könnte man statt einem Wörterbuch auch eine Liste zum Zählen verwenden. Entweder eine mit 11 Elementen, wo man auch die 0 mit zählt, auch wenn die nicht vorkommt in den Eingabedaten, oder eine mit 10 Elementen wo man dann den Index beim Zugriff entsprechend anpassen muss.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Hallo goodbyeworld,
wenn man ein int-Zahl erzeugt, dann vergleicht man besser auch mit einer Zahl. ("1" ist ein String mit der Zahl 1 und keine Zahl).
Lesenswertes Tutorial: Python's Counter: The Pythonic Way to Count Objects https://realpython.com/python-counter/
Kürzerer Code:
wenn man ein int-Zahl erzeugt, dann vergleicht man besser auch mit einer Zahl. ("1" ist ein String mit der Zahl 1 und keine Zahl).
Code: Alles auswählen
import random
counter1 = 0
counter2 = 0
counter3 = 0
counter4 = 0
counter5 = 0
counter6 = 0
counter7 = 0
counter8 = 0
counter9 = 0
counter10 = 0
listeX = []
for i in range(100):
listeX.append(random.randint(1, 10))
if listeX[i] == 1:
counter1 = counter1 + 1
if listeX[i] == 2:
counter2 = counter2 + 1
if listeX[i] == 3:
counter3 = counter3 + 1
if listeX[i] == 4:
counter4 = counter4 + 1
if listeX[i] == 5:
counter5 = counter5 + 1
if listeX[i] == 6:
counter6 = counter6 + 1
if listeX[i] == 7:
counter7 = counter7 + 1
if listeX[i] == 8:
counter8 = counter8 + 1
if listeX[i] == 9:
counter9 = counter9 + 1
if listeX[i] == 10:
counter10 = counter10 + 1
print(counter1)
print(counter2)
print(counter3)
print(counter4)
print(counter5)
print(counter6)
print(counter7)
print(counter8)
print(counter9)
print(counter10)
Kürzerer Code:
Code: Alles auswählen
from collections import Counter
from random import randint
liste = []
for i in range(100):
liste.append(randint(1,10))
counter = Counter(liste) # erstellt ein dictionary aller elemente der liste und zählt, wie oft sie vorkommen
for key, value in sorted(counter.items()):
print(f"{key} : {value}")
Beispielausgabe:
1 : 9
2 : 7
3 : 6
4 : 10
5 : 7
6 : 3
7 : 19
8 : 9
9 : 16
10 : 14
Code: Alles auswählen
from collections import Counter
from random import randint
[print(f"{number}: {count}") for number, count in Counter([randint(1, 100) for _ in range(100)]).most_common()]
- __blackjack__
- User
- Beiträge: 14078
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
Das missbraucht eine „list comprehension“ um…, ja warum eigentlich? Das ist nicht einmal kürzer als eine ``for``-Schleife. Wenn man das in einer Zeile als ``for``-Schleife schreibt, dann ist das um 1 Zeichen kürzer, weil man einen Doppelpunkt statt zwei Klammerzeichen hat.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Bitte entschuldige, aber ich fürchte, Du hast den Zeilenumbruch und die Einrückung vergessen...__blackjack__ hat geschrieben: Dienstag 12. April 2022, 17:01 Das missbraucht eine „list comprehension“ um…, ja warum eigentlich? Das ist nicht einmal kürzer als eine ``for``-Schleife. Wenn man das in einer Zeile als ``for``-Schleife schreibt, dann ist das um 1 Zeichen kürzer, weil man einen Doppelpunkt statt zwei Klammerzeichen hat.

- __blackjack__
- User
- Beiträge: 14078
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
Ich dachte es ging um kurz. Mit Zeilenumbrüchen wird die „list comprehension“ noch länger und es sind mehr als 10 Zeichen Unterschied.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Kürzer schaffe ich es nicht:
Code: Alles auswählen
import collections as c,random
for n,x in c.Counter(random.choices(range(1,101),k=100).most_common():print(f"{n}: {x}")
-
- User
- Beiträge: 6
- Registriert: Freitag 8. April 2022, 22:11
Vielen Dank Euch Allen für diese wertvollen inputs.
Frohe Ostern!
Frohe Ostern!