Seite 1 von 1
Counter - Zählen von gewissen Elementen, zb die Zahlen "5"
Verfasst: Freitag 8. April 2022, 22:19
von goodbyeworld
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)
Re: Counter - Zählen von gewissen Elementen, zb die Zahlen "5"
Verfasst: Samstag 9. April 2022, 06:43
von sparrow
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
Re: Counter - Zählen von gewissen Elementen, zb die Zahlen "5"
Verfasst: Samstag 9. April 2022, 07:39
von goodbyeworld
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
Re: Counter - Zählen von gewissen Elementen, zb die Zahlen "5"
Verfasst: Samstag 9. April 2022, 08:49
von 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?
Re: Counter - Zählen von gewissen Elementen, zb die Zahlen "5"
Verfasst: Samstag 9. April 2022, 10:48
von /me
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.
Re: Counter - Zählen von gewissen Elementen, zb die Zahlen "5"
Verfasst: Samstag 9. April 2022, 11:34
von __blackjack__
Das ganze mal an ein bisschen Code demonstriert:
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)
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.
Re: Counter - Zählen von gewissen Elementen, zb die Zahlen "5"
Verfasst: Samstag 9. April 2022, 18:28
von dirk009
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).
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)
Lesenswertes Tutorial: Python's Counter: The Pythonic Way to Count Objects
https://realpython.com/python-counter/
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
Re: Counter - Zählen von gewissen Elementen, zb die Zahlen "5"
Verfasst: Dienstag 12. April 2022, 16:41
von LukeNukem
dirk009 hat geschrieben: Samstag 9. April 2022, 18:28
Kürzerer Code:
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()]
Re: Counter - Zählen von gewissen Elementen, zb die Zahlen "5"
Verfasst: Dienstag 12. April 2022, 17:01
von __blackjack__
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.
Re: Counter - Zählen von gewissen Elementen, zb die Zahlen "5"
Verfasst: Mittwoch 13. April 2022, 12:00
von LukeNukem
__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.
Bitte entschuldige, aber ich fürchte, Du hast den Zeilenumbruch und die Einrückung vergessen...

Re: Counter - Zählen von gewissen Elementen, zb die Zahlen "5"
Verfasst: Mittwoch 13. April 2022, 12:10
von __blackjack__
Ich dachte es ging um kurz. Mit Zeilenumbrüchen wird die „list comprehension“ noch länger und es sind mehr als 10 Zeichen Unterschied.
Re: Counter - Zählen von gewissen Elementen, zb die Zahlen "5"
Verfasst: Mittwoch 13. April 2022, 19:40
von Sirius3
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}")
Re: Counter - Zählen von gewissen Elementen, zb die Zahlen "5"
Verfasst: Donnerstag 14. April 2022, 06:58
von goodbyeworld
Vielen Dank Euch Allen für diese wertvollen inputs.
Frohe Ostern!