Trouver le mode d'une liste

avec une liste D'articles, rappelons que le" mode de la liste est l'article qui apparaît le plus souvent.

je voudrais savoir comment créer une fonction qui permet de trouver le mode d'une liste, mais qui affiche un message si la liste ne dispose pas d'un mode (par exemple, tous les éléments de la liste n'apparaissent qu'une fois). Je veux faire cette fonction sans importer Aucune fonction. J'essaie de créer ma propre fonction à partir de rien.

78
demandé sur Stefan Pochmann 2012-05-29 15:00:14

18 réponses

vous pouvez utiliser la fonction max et une clé. Jetez un oeil à la fonction Python max en utilisant 'key' et l'expression lambda .

max(set(list), key=list.count)
100
répondu David Dao 2017-05-23 12:34:31

vous pouvez utiliser le Counter fourni dans le collections paquet qui a une mode - fonction esque

from collections import Counter
data = Counter(your_list_in_here)
data.most_common()   # Returns all unique items and their counts
data.most_common(1)  # Returns the highest occurring item

Note: Counter est nouveau en python 2.7 et n'est pas disponible dans les versions précédentes.

80
répondu Christian Witts 2012-09-25 11:08:16

Python 3.4 comprend la méthode statistics.mode , il est donc simple:

>>> from statistics import mode
>>> mode([1, 1, 2, 3, 3, 3, 3, 4])
 3

vous pouvez avoir n'importe quel type d'éléments dans la liste, pas seulement numérique:

>>> mode(["red", "blue", "blue", "red", "green", "red", "red"])
 'red'
38
répondu jabaldonedo 2014-03-17 15:19:11

en prenant une feuille de certains logiciels de statistiques, à savoir SciPy et MATLAB , ceux-ci juste retourner la plus petite valeur commune, donc si deux valeurs se produisent également souvent, le plus petit d'entre eux sont retournés. J'espère qu'un exemple aidera:

>>> from scipy.stats import mode

>>> mode([1, 2, 3, 4, 5])
(array([ 1.]), array([ 1.]))

>>> mode([1, 2, 2, 3, 3, 4, 5])
(array([ 2.]), array([ 2.]))

>>> mode([1, 2, 2, -3, -3, 4, 5])
(array([-3.]), array([ 2.]))

y a-t-il une raison pour laquelle vous ne pouvez pas suivre cette convention?

20
répondu Chris 2012-05-29 11:12:01

il existe de nombreuses façons simples de trouver le mode d'une liste en Python telles que:

import statistics
statistics.mode([1,2,3,3])
>>> 3

ou, vous pourriez trouver le max par son compte

max(array, key = array.count)

le problème avec ces deux méthodes est qu'elles ne fonctionnent pas avec plusieurs modes. La première renvoie une erreur, tandis que la seconde renvoie le premier mode.

pour trouver les modes d'un ensemble, vous pouvez utiliser cette fonction:

def mode(array):
    most = max(list(map(array.count, array)))
    return list(set(filter(lambda x: array.count(x) == most, array)))
20
répondu mathwizurd 2015-08-10 03:26:02

j'ai écrit cette fonction pratique pour trouver le mode.

def mode(nums):
    corresponding={}
    occurances=[]
    for i in nums:
            count = nums.count(i)
            corresponding.update({i:count})

    for i in corresponding:
            freq=corresponding[i]
            occurances.append(freq)

    maxFreq=max(occurances)

    keys=corresponding.keys()
    values=corresponding.values()

    index_v = values.index(maxFreq)
    global mode
    mode = keys[index_v]
    return mode
2
répondu user2975335 2013-12-26 21:22:00

Court, mais de toute façon moche:

def mode(arr) :
    m = max([arr.count(a) for a in arr])
    return [x for x in arr if arr.count(x) == m][0] if m>1 else None

utilisant un dictionnaire, légèrement moins laid:

def mode(arr) :
    f = {}
    for a in arr : f[a] = f.get(a,0)+1
    m = max(f.values())
    t = [(x,f[x]) for x in f if f[x]==m]
    return m > 1 t[0][0] else None
2
répondu Carl 2014-08-18 14:03:07

un peu plus longtemps, mais peut avoir plusieurs modes et peut obtenir la chaîne avec la plupart des comptes ou mélange de types de données.

def getmode(inplist):
    '''with list of items as input, returns mode
    '''
    dictofcounts = {}
    listofcounts = []
    for i in inplist:
        countofi = inplist.count(i) # count items for each item in list
        listofcounts.append(countofi) # add counts to list
        dictofcounts[i]=countofi # add counts and item in dict to get later
    maxcount = max(listofcounts) # get max count of items
    if maxcount ==1:
        print "There is no mode for this dataset, values occur only once"
    else:
        modelist = [] # if more than one mode, add to list to print out
        for key, item in dictofcounts.iteritems():
            if item ==maxcount: # get item from original list with most counts
                modelist.append(str(key))
        print "The mode(s) are:",' and '.join(modelist)
        return modelist 
2
répondu timpjohns 2016-02-09 21:56:40

dans le cas où vous êtes intéressé par le plus petit, le plus grand ou tous les modes:

def get_small_mode(numbers, out_mode):
    counts = {k:numbers.count(k) for k in set(numbers)}
    modes = sorted(dict(filter(lambda x: x[1] == max(counts.values()), counts.items())).keys())
    if out_mode=='smallest':
        return modes[0]
    elif out_mode=='largest':
        return modes[-1]
    else:
        return modes
2
répondu tashuhka 2018-02-22 19:52:43

pourquoi pas

def print_mode (thelist):
  counts = {}
  for item in thelist:
    counts [item] = counts.get (item, 0) + 1
  maxcount = 0
  maxitem = None
  for k, v in counts.items ():
    if v > maxcount:
      maxitem = k
      maxcount = v
  if maxcount == 1:
    print "All values only appear once"
  elif counts.values().count (maxcount) > 1:
    print "List has multiple modes"
  else:
    print "Mode of list:", maxitem

ceci n'a pas quelques vérifications d'erreurs qu'il devrait avoir, mais il trouvera le mode sans importer Aucune Fonction et affichera un message si toutes les valeurs apparaissent une seule fois. Il détectera également plusieurs articles partageant le même nombre maximum, bien qu'il n'était pas clair si vous vouliez cela.

1
répondu lxop 2012-05-29 23:32:06

cette fonction renvoie le ou les modes d'une fonction quel que soit le nombre, ainsi que la fréquence du ou des modes de l'ensemble de données. Si il n'y a pas de mode (ie. tous les éléments se produisent qu'une seule fois), la fonction renvoie une chaîne d'erreur. Ceci est similaire à la fonction D'A_nagpal ci-dessus, mais est, à mon humble avis, plus complet, et je pense que c'est plus facile à comprendre pour n'importe quel novice de Python (tel que le vôtre vraiment) lisant cette question à comprendre.

 def l_mode(list_in):
    count_dict = {}
    for e in (list_in):   
        count = list_in.count(e)
        if e not in count_dict.keys():
            count_dict[e] = count
    max_count = 0 
    for key in count_dict: 
        if count_dict[key] >= max_count:
            max_count = count_dict[key]
    corr_keys = [] 
    for corr_key, count_value in count_dict.items():
        if count_dict[corr_key] == max_count:
            corr_keys.append(corr_key)
    if max_count == 1 and len(count_dict) != 1: 
        return 'There is no mode for this data set. All values occur only once.'
    else: 
        corr_keys = sorted(corr_keys)
        return corr_keys, max_count
1
répondu user4406935 2014-12-30 23:39:44
def mode(inp_list):
    sort_list = sorted(inp_list)
    dict1 = {}
    for i in sort_list:        
            count = sort_list.count(i)
            if i not in dict1.keys():
                dict1[i] = count

    maximum = 0 #no. of occurences
    max_key = -1 #element having the most occurences

    for key in dict1:
        if(dict1[key]>maximum):
            maximum = dict1[key]
            max_key = key 
        elif(dict1[key]==maximum):
            if(key<max_key):
                maximum = dict1[key]
                max_key = key

    return max_key
0
répondu akshaynagpal 2014-12-13 12:52:54
def mode(data):
    lst =[]
    hgh=0
    for i in range(len(data)):
        lst.append(data.count(data[i]))
    m= max(lst)
    ml = [x for x in data if data.count(x)==m ] #to find most frequent values
    mode = []
    for x in ml: #to remove duplicates of mode
        if x not in mode:
        mode.append(x)
    return mode
print mode([1,2,2,2,2,7,7,5,5,5,5])
0
répondu Venkata Prasanth T 2015-04-09 07:16:58

Voici une fonction simple qui obtient le premier mode qui apparaît dans une liste. Il fait un dictionnaire avec les éléments de liste comme clés et le nombre d'occurrences et lit ensuite les valeurs de dict pour obtenir le mode.

def findMode(readList):
    numCount={}
    highestNum=0
    for i in readList:
        if i in numCount.keys(): numCount[i] += 1
        else: numCount[i] = 1
    for i in numCount.keys():
        if numCount[i] > highestNum:
            highestNum=numCount[i]
            mode=i
    if highestNum != 1: print(mode)
    elif highestNum == 1: print("All elements of list appear once.")
0
répondu SMS von der Tann 2016-02-14 01:42:17

cela retournera tous les modes:

def mode(numbers)
    largestCount = 0
    modes = []
    for x in numbers:
        if x in modes:
            continue
        count = numbers.count(x)
        if count > largestCount:
            del modes[:]
            modes.append(x)
            largestCount = count
        elif count == largestCount:
            modes.append(x)
    return modes
0
répondu Tim Orton 2017-04-03 14:03:15

pour qu'un numéro soit un mode , il doit se produire plus de fois que au moins un autre numéro dans la liste, et il doit et non être le seul numéro dans la liste. Ainsi, j'ai remanié la réponse de @mathwizurd (pour utiliser la méthode difference ) comme suit:

def mode(array):
    '''
    returns a set containing valid modes
    returns a message if no valid mode exists
      - when all numbers occur the same number of times
      - when only one number occurs in the list 
      - when no number occurs in the list 
    '''
    most = max(map(array.count, array)) if array else None
    mset = set(filter(lambda x: array.count(x) == most, array))
    return mset if set(array) - mset else "list does not have a mode!" 

ces essais sont réussis:

mode([]) == None 
mode([1]) == None
mode([1, 1]) == None 
mode([1, 1, 2, 2]) == None 
0
répondu lifebalance 2017-12-08 19:21:48

si vous voulez une approche claire, utile pour la classe et n'utilisant que des listes et des dictionnaires par compréhension, vous pouvez faire:

def mode(my_list):
    # Form a new list with the unique elements
    unique_list = sorted(list(set(my_list)))
    # Create a comprehensive dictionary with the uniques and their count
    appearance = {a:my_list.count(a) for a in unique_list} 
    # Calculate max number of appearances
    max_app = max(appearance.values())
    # Return the elements of the dictionary that appear that # of times
    return {k: v for k, v in appearance.items() if v == max_app}
0
répondu María Frances Gaska 2018-01-18 16:22:07
#function to find mode
def mode(data):  
    modecnt=0
#for count of number appearing
    for i in range(len(data)):
        icount=data.count(data[i])
#for storing count of each number in list will be stored
        if icount>modecnt:
#the loop activates if current count if greater than the previous count 
            mode=data[i]
#here the mode of number is stored 
            modecnt=icount
#count of the appearance of number is stored
    return mode
print mode(data1)
0
répondu Rinki Nag 2018-03-29 17:44:13