Gibt es eine Python Funktion für das meist vorkommende Element in einem Iterabe)

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
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

Ich habe das geschrieben:

Code: Alles auswählen

def most_in(sequence):

    most_occured = None
    counts = {}
    count = 0

    for item in sequence:
        counts[item] = 0
        
    for item in sequence:
        counts[item] += 1

    for item in sequence:
        if counts[item] > count:
            count = counts[item]
            most_occured = item
            
    return most_occured

        
def main():
    my_list = [
        (15,0,0),
        (75,0,1),
        (75,0,1),
        (25,0,1),
        (75,0,1),
        (15,0,0)]

    most_occurred = most_in(my_list)
    print(most_occurred)
 
if __name__ == '__main__':
    main()
Kann man das auch einfacher machen?
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

Code: Alles auswählen

from collections import Counter

counts = Counter(my_list)
print(counts.most_common(1)[0])
oder, falls Du Dir das wirklich selbst programmieren willst:

Code: Alles auswählen

def most_in(sequence):
    counts = {}
    for item in sequence:
        counts[item] = counts.get(item, 0) + 1
    return max(counts.items(), key=lambda m: m[1])[0]
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

@Sirius3: Danke, dann ist die richtige Lösung also:

Code: Alles auswählen

from collections import Counter

def most_in(sequence):
    most_common = None
    if sequence:
        most_common = Counter(sequence).most_common(1)[0][0]
    return most_common
        
def main():
    my_list = [
        (15,0,0),
        (75,0,1),
        (75,0,1),
        (25,0,1),
        (75,0,1),
        (15,0,0)]

    most_common = most_in(my_list)
    print(most_common)

 
if __name__ == '__main__':
    main()
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@Alfons Mittelmeyer: meist will man eine Exception, wenn man kein Element ermitteln kann, weil die Liste leer ist, also hier

Code: Alles auswählen

def most_in(sequence):
    return Counter(sequence).most_common(1)[0][0]
einen IndexError, oder hier:

Code: Alles auswählen

def most_in(sequence):
    return max(Counter(sequence).most_common(1))[0]
einen ValueError.
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

@Sirius: meinst Du dann besser so:

most_common = None if not my_list else most_in(my_list)

statt

most_common =most_in(my_list)

Mich stören aber solche Codezeilen, besonders, wenn sie öfter vorkommen.
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@Alfons Mittelmeyer: die Frage ist, wie Du den Sonderfall Leere Liste im weiteren Verlauf behandeln willst, und da sind im Allgemeinen Exceptions besser; None könnte ja durchaus auch ein valider Eintrag in der Liste sein.
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

Sirius3 hat geschrieben:@Alfons Mittelmeyer: die Frage ist, wie Du den Sonderfall Leere Liste im weiteren Verlauf behandeln willst, und da sind im Allgemeinen Exceptions besser; None könnte ja durchaus auch ein valider Eintrag in der Liste sein.
Die leere Liste ist kein Sonderfall, sondern der Normalfall
Eine gefüllte Liste entsteht nur wenn jemand self.columnconfigure oder self.rowconfigure benutzt.
Und der Sonderfall ist, wenn jemand im GuiDesigner die Spalten oder Zeilen wieder verringert. Dann wird bei Verwendung von self.columnconfigure oder self.rowconfigure der Rest mit (0,0,0) aufgefüllt.
Antworten