liste auslesen nach Kriterien

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
Benutzeravatar
Windsurfer
User
Beiträge: 11
Registriert: Mittwoch 26. Mai 2010, 11:47

Montag 7. Juni 2010, 12:57

Hallo zusammen,
vielleicht ist meine Frage recht simpel - ich finde aber keine Lösung :K

Ich habe eine Liste mit ca. 4000 Zahlen (zw. 1 und 22). Nun möchte ich die Anzahl der vorhandenen Zahlen einzeln ermitteln. z.B. 45x die 1, 533x die 2 usw.
Außerdem brauche ich noch die Position der einsen, zweien usw. in der Liste.

Wie könnte ich sowas anstellen?
Viele Dank für eure Hilfe!
Zuletzt geändert von Windsurfer am Montag 7. Juni 2010, 13:13, insgesamt 1-mal geändert.
Benutzeravatar
b.esser-wisser
User
Beiträge: 272
Registriert: Freitag 20. Februar 2009, 14:21
Wohnort: Bundeshauptstadt B.

Montag 7. Juni 2010, 13:12

Das zählen geht z.B. mit collections.defaultdict():

Code: Alles auswählen

import collections

def count(numbers, counters=None):
    if counters is None:
        counters = collections.defaultdict(int)
    for number in numbers:
        counters[number] += 1
    return counters
Für alles andere poste mal mehr Details, Beispielcode etc.

hth, Jörg
Edit: Ergänzungen wegen edit des OP
Benutzeravatar
cofi
Moderator
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Montag 7. Juni 2010, 13:38

Wenn du die Positionen brauchst, kannst du auch ein `defaultdict(list)` nehmen und statt hochzaehlen die aktuelle Position in die Liste der Nummer eintragen, allerdings muss man dafuer ueber die Laenge der Nummernliste iterieren.
Benutzeravatar
Windsurfer
User
Beiträge: 11
Registriert: Mittwoch 26. Mai 2010, 11:47

Montag 7. Juni 2010, 13:42

Hi Jörg,
vielen Dank, das klappt schon mal!

Jetzt muss ich mal sehen wie ich weiter mache. Ziel der Sache ist es, aus einer Shape Datei, welche verschiedene Croptypes (in einer bestimmten Anzahl) enthält, diese auszulesen und von jedem Croptype z.B. 50% zu verwenden, und diese per random rauszupicken und damit eine neue Shape Datei zu erstellen (ogr2ogr).

bis dann :)
Benutzeravatar
Windsurfer
User
Beiträge: 11
Registriert: Mittwoch 26. Mai 2010, 11:47

Montag 7. Juni 2010, 13:46

@ cofi
Die Idee hört sich nicht schlecht an, nur weiß ich nicht, wie ich das programmieren soll.
Und wie würdest du die Position abspeichern?
Ich arbeite erst seit ein paar Wochen mit Python, daher entschuldige meine Naive nachfrage..

lg
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Montag 7. Juni 2010, 14:49

So?

Code: Alles auswählen

import random

def setup():
    numbers = []
    for i in range(4000):
        numbers.append(random.randint(1, 11) + random.randint(1, 11))
    return numbers

def invert(numbers):
    indexes = [[] for n in range(max(numbers))]
    for i, n in enumerate(numbers):
        indexes[n - 1].append(i)
    return indexes

indexes = invert(setup())
print("Counts:")
for i, n in enumerate(indexes):
    print("%d: %s" % (i + 1, len(n)))
print()
print("Indices:")
for i, n in enumerate(indexes):
    print("%d: %s" % (i + 1, n))
Stefan
Benutzeravatar
cofi
Moderator
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Montag 7. Juni 2010, 17:05

Ahh wie konnte ich nur `enumerate` vergessen :(

Code: Alles auswählen

from collections import defaultdict

def count(numbers, counters=None):
    if counters is None:
        counters = defaultdict(list)
    for i, number in enumerate(numbers):
        counters[number].append(i)
    return counters
Benutzeravatar
Windsurfer
User
Beiträge: 11
Registriert: Mittwoch 26. Mai 2010, 11:47

Dienstag 8. Juni 2010, 10:16

Nicht schlecht was es alles für schicke Funktionen gibt!
Wenns jemanden interessiert, kann ich nachher mal meine fertige Lösung posten.

Danke erst einmal für die super Tipps! :)
Antworten