목록 모드 찾기


126

항목 목록이 주어지면 목록 모드 가 가장 자주 발생하는 항목임을 상기하십시오.

목록의 모드를 찾을 수 있지만 목록에 모드가없는 경우 메시지를 표시하는 함수를 만드는 방법을 알고 싶습니다 (예 : 목록의 모든 항목이 한 번만 표시됨). 함수를 가져 오지 않고이 함수를 만들고 싶습니다. 나는 처음부터 내 자신의 기능을 만들려고 노력하고 있습니다.


죄송합니다. '목록 모드'가 정확히 무엇을 의미하는지 설명해 주시겠습니까?
Vikas

5
@Vikas : 모드는 가장 자주 발생하는 요소입니다 (있는 경우). 일부 정의는 둘 이상이있는 경우 이러한 모든 요소의 산술 평균을 취하도록 확장합니다.
Jeremy Roman

여기에 너무 많은 오답이 있습니다! 예를 들어 assert(mode[1, 1, 1]) == Noneassert(mode[1, 2, 3, 4]) == None. 숫자가 될하려면 mode, 그것은 목록에서 적어도 하나의 다른 수보다 배 더 많은 수를 발생해야하며, 그것은해야 하지 목록에있는 유일한 숫자.
lifebalance

답변:


156

max기능과 키를 사용할 수 있습니다 . 'key'및 lambda expression을 사용하는 python max 함수를 살펴보십시오 .

max(set(lst), key=lst.count)

6
추가 수입이 필요하지 않다는 점을 감안할 때 OP에 대한 정답입니다. 잘 했어, 데이비드
제이슨 파햄

12
이것이에서 실행되는 것 같습니다 O(n**2). 그렇습니까?
lirtosiast 2015 년

7
이것은 2 차 런타임을 가지고 있습니다.
Padraic Cunningham 2015

20
또한 max(lst, key=lst.count). (그리고 난 정말 목록을 호출 할 것입니다 list.)
스테판 Pochmann에게

2
바이 모달 배포에서 이것이 어떻게 작동하는지 설명 할 수 있습니까? 예를 들어 a = [22, 33, 11, 22, 11]; print(max(set(a), key=a.count))반환 11. 항상 최소 모드를 반환합니까? 그렇다면 그 이유는 무엇입니까?
battey

99

-esque 기능 이있는 패키지에 Counter제공된 것을 사용할 수 있습니다.collectionsmode

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

참고 : 카운터는 Python 2.7의 새로운 기능이며 이전 버전에서는 사용할 수 없습니다.


19
질문은 사용자가 처음부터 함수를 만들고 싶어한다는 것입니다. 즉, 가져 오기가 없습니다.
dbliss

3
마지막 줄은 모드와 그 빈도를 포함하는 튜플이 포함 된 목록을 반환합니다. 모드를 사용하려면 Counter(your_list_in_here).most_common(1)[0][0]. 둘 이상의 모드가있는 경우 임의의 모드를 반환합니다.
Rory Daulton 2017

1
가 가정 n가장 일반적인 modes. Counter (your_list_in_here) .most_common (1) [0] [0]이 첫 번째 모드를 얻는다면 어떻게 다른 가장 일반적인 모드를 얻을 수 mode있습니까? 마지막 01? 하나는을 사용자 정의 할 수있는 기능을 할 수 있습니다 mode.. 자신의 취향에를

1
모드가 두 개 이상인 경우 이러한 숫자 중 가장 큰 숫자를 반환하려면 어떻게해야합니까?
Akin Hwan

59

Python 3.4에는 메서드가 포함되어 statistics.mode있으므로 간단합니다.

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

목록에는 숫자뿐만 아니라 모든 유형의 요소가 포함될 수 있습니다.

>>> mode(["red", "blue", "blue", "red", "green", "red", "red"])
 'red'

17
mode ([1, 1,1,1, 2, 3, 3, 3, 3, 4]) 사용시 오류가 발생합니다. 여기서 1과 3은 동일한 횟수를 반복합니다. 이상적으로는 가장 크지 만 동일한 횟수를 반환해야합니다. StatisticsError : 고유 모드가 없습니다. 동일하게 공통된 값 2 개 발견
aman_novice

4
이 3.4 통계 패키지를 사용하지 않았지만 scipy.stats.mode는 가장 작은 것을 반환합니다 (이 경우 1). 그러나 특정 경우에는 오류가 발생하는 것을 선호합니다 ...
wordsmith

2
@aman_novice,이 문제는 Python 3.8에서 해결되었습니다. docs.python.org/3/library/statistics.html#statistics.mode
Michael D

2
python 3.8도 추가 multimode되어 둘 이상의 모드가있을 때 여러 모드를 반환합니다.
stason

30

일부 통계 소프트웨어, 즉 SciPyMATLAB 에서 리프를 가져 오면 가장 작은 가장 일반적인 값만 반환되므로 두 값이 똑같이 자주 발생하면 가장 작은 값이 반환됩니다. 예제가 도움이되기를 바랍니다.

>>> 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.]))

이 대회를 따를 수없는 이유가 있습니까?


4
여러 개가있을 때 가장 작은 모드 만 반환되는 이유는 무엇입니까?
zyxue

@zyxue 간단한 통계 규칙
chrisfs apr

2
@chrisfs가 여러 개인 경우 가장 큰 모드를 반환하도록하려면?
Akin Hwan

25

다음과 같이 Python에서 목록 모드를 찾는 간단한 방법이 많이 있습니다.

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

또는 개수로 최대 값을 찾을 수 있습니다.

max(array, key = array.count)

이 두 가지 방법의 문제점은 여러 모드에서 작동하지 않는다는 것입니다. 첫 번째는 오류를 반환하고 두 번째는 첫 번째 모드를 반환합니다.

세트의 모드를 찾기 위해 다음 기능을 사용할 수 있습니다.

def mode(array):
    most = max(list(map(array.count, array)))
    return list(set(filter(lambda x: array.count(x) == most, array)))

3
모드를 사용하면 두 요소가 같은 시간에 발생하면 오류가 발생합니다.
Abhishek Mishra

죄송합니다.이 댓글이 정말 늦게 보였습니다. Statistics.mode (array)는 여러 모드에서 오류를 반환하지만 다른 메서드는 수행하지 않습니다.
mathwizurd

7

목록이 비어있을 때 작동하지 않는 커뮤니티 답변 확장, 다음은 모드에 대한 작업 코드입니다.

def mode(arr):
        if arr==[]:
            return None
        else:
            return max(set(arr), key=arr.count)

3

가장 작은 모드, 가장 큰 모드 또는 모든 모드에 관심이있는 경우 :

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

모드를 찾기 위해이 편리한 함수를 작성했습니다.

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
이 방법은 2 개의 항목이 동일한 번호를 갖는 경우 실패합니다. 발생의.
akshaynagpal

2

짧지 만 왠지 못생긴 :

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

딕셔너리를 사용하면 약간 덜 못 생겼습니다.

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

조금 더 길지만 여러 모드를 가질 수 있으며 대부분의 개수 또는 혼합 데이터 유형이있는 문자열을 가져올 수 있습니다.

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

숫자가 될하려면 mode, 그것은 배보다 더 많은 수의 발생해야 하나 이상의 다른 번호 목록을, 그리고 그것을해야 하지 목록에있는 유일한 숫자. 그래서 difference다음과 같이 @mathwizurd의 대답 ( 방법 을 사용하기 위해 ) 을 리팩터링했습니다 .

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!" 

이 테스트는 성공적으로 통과합니다.

mode([]) == None 
mode([1]) == None
mode([1, 1]) == None 
mode([1, 1, 2, 2]) == None 

1

왜 안돼

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

이것은 가져야 할 몇 가지 오류 검사가 없지만 함수를 가져 오지 않고 모드를 찾고 모든 값이 한 번만 나타나면 메시지를 인쇄합니다. 또한 동일한 최대 개수를 공유하는 여러 항목을 감지하지만 원하는 경우 명확하지 않습니다.


그래서
제가하려는

실제로 직접 시도해 보셨습니까? 내 코드에서 동일한 개수로 모든 항목을 인쇄하도록하는 확장은 상당히 간단합니다.
lxop

1

이 함수는 데이터 세트의 모드 빈도뿐 아니라 여러 모드에 관계없이 함수의 모드를 반환합니다. 모드가없는 경우 (즉, 모든 항목이 한 번만 발생) 함수는 오류 문자열을 반환합니다. 이것은 위의 A_nagpal의 기능과 유사하지만, 제 겸손한 의견으로는 더 완벽하며,이 질문을 읽는 파이썬 초보자 (예 : 진정으로)가 이해하기가 더 쉽다고 생각합니다.

 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

"이 함수는 오류 문자열을 반환합니다."라고 말했기 때문에 이렇게 말합니다. 읽어 선이 return 'There is no mode for this data set. All values occur only once.'와 오류 메시지로 전환 할 수있다 traceback'경우 조건으로 : 들여 쓰기에 다음 줄 인상에 ValueError ('..이 모든 값이 한 번만 발생이 데이터 세트에 대한 모드입니다 ') 여기에 목록 의 다른 유형의 당신이 제기 할 수있는 오류.

1

그러면 모든 모드가 반환됩니다.

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

1

가져 오기없이 목록 모드를 찾는 간단한 코드 :

nums = #your_list_goes_here
nums.sort()
counts = dict()
for i in nums:
    counts[i] = counts.get(i, 0) + 1
mode = max(counts, key=counts.get)

모드가 여러 개인 경우 최소 노드를 반환해야합니다.


0
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
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

다음은 목록에서 발생하는 첫 번째 모드를 가져 오는 간단한 함수입니다. 목록 요소를 키 및 발생 횟수로 사전을 만든 다음 dict 값을 읽어 모드를 가져옵니다.

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

명확한 접근 방식을 원하고 교실에 유용하며 이해력에 따라 목록과 사전 만 사용하려면 다음을 수행 할 수 있습니다.

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
#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

목록의 평균, 중앙값 및 최빈값을 찾는 방법은 다음과 같습니다.

import numpy as np
from scipy import stats

#to take input
size = int(input())
numbers = list(map(int, input().split()))

print(np.mean(numbers))
print(np.median(numbers))
print(int(stats.mode(numbers)[0]))

0
import numpy as np
def get_mode(xs):
    values, counts = np.unique(xs, return_counts=True)
    max_count_index = np.argmax(counts) #return the index with max value counts
    return values[max_count_index]
print(get_mode([1,7,2,5,3,3,8,3,2]))

0

최소 모드를 찾는 사람들을 위해, 예 : numpy를 사용하는 이중 모달 분포의 경우.

import numpy as np
mode = np.argmax(np.bincount(your_list))

0

데이터 세트의 모드 는 세트 에서 가장 자주 발생 하는 멤버 입니다. 동일한 횟수로 가장 자주 나타나는 두 멤버가있는 경우 데이터에는 두 가지 모드가 있습니다. 이것은 ... 불리운다 바이 모달 합니다.

2 개 이상의 모드가있는 경우 데이터를 multimodal 이라고 합니다. 데이터 세트의 모든 멤버가 동일한 횟수로 나타나면 데이터 세트에 모드없는 것입니다. 것입니다.

다음 함수 modes()는 주어진 데이터 목록에서 모드 를 찾는 데 사용할 수 있습니다 .

import numpy as np; import pandas as pd

def modes(arr):
    df = pd.DataFrame(arr, columns=['Values'])
    dat = pd.crosstab(df['Values'], columns=['Freq'])
    if len(np.unique((dat['Freq']))) > 1:
        mode = list(dat.index[np.array(dat['Freq'] == max(dat['Freq']))])
        return mode
    else:
        print("There is NO mode in the data set")

산출:

# For a list of numbers in x as
In [1]: x = [2, 3, 4, 5, 7, 9, 8, 12, 2, 1, 1, 1, 3, 3, 2, 6, 12, 3, 7, 8, 9, 7, 12, 10, 10, 11, 12, 2]
In [2]: modes(x)
Out[2]: [2, 3, 12]
# For a list of repeated numbers in y as
In [3]: y = [2, 2, 3, 3, 4, 4, 10, 10]
In [4]: modes(y)
There is NO mode in the data set
# For a list of stings/characters in z as
In [5]: z = ['a', 'b', 'b', 'b', 'e', 'e', 'e', 'd', 'g', 'g', 'c', 'g', 'g', 'a', 'a', 'c', 'a']
In [6]: modes(z)
Out[6]: ['a', 'g']

이러한 패키지에서 함수 를 가져 numpy오거나 pandas호출 하지 않으려면 동일한 출력을 얻기 위해 함수를 다음 modes()과 같이 작성할 수 있습니다.

def modes(arr):
    cnt = []
    for i in arr:
        cnt.append(arr.count(i))
    uniq_cnt = []
    for i in cnt:
        if i not in uniq_cnt:
            uniq_cnt.append(i)
    if len(uniq_cnt) > 1:
        m = []
        for i in list(range(len(cnt))):
            if cnt[i] == max(uniq_cnt):
                m.append(arr[i])
        mode = []
        for i in m:
            if i not in mode:
                mode.append(i)
        return mode
    else:
        print("There is NO mode in the data set")
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.