簡體   English   中英

在 Python 字典中查找最頻繁的值(具有最大計數的值)

[英]Find most frequent value in Python dictionary (value with maximum count)

我正在嘗試編寫一個函數,該函數返回 Python 字典中最頻繁的值。 我不想導入任何東西,只是簡單的代碼。

有什么想法嗎? 例如,如果我的字典是:

input_dict = {'A': 1963, 'B': 1963, 
    'C': 1964, 'D': 1964, 'E': 1964,
    'F': 1965, 'G': 1965, 'H': 1966,
    'I': 1967, 'J': 1967, 'K': 1968,
    'L': 1969 ,'M': 1969,
    'N': 1970}

預期結果是1964 (因為它作為dict的值出現 3 次(最大計數))

這是我最后一次嘗試:

def most_prolific(input_dict):

    values = []
    for year in input_dict.values():
        if year in input_dict.values():
            values.append(year)


    for most in values:
        if most in values:
         return max(values.count(most))

使用collections.Counter

實現這一點的最簡單方法是使用 Python 的內置collections.Counter ,它是為相同目的而創建的。 以下是您的示例的示例代碼:

from collections import Counter 
input_dict = {'A': 1963, 'B': 1963, 'C': 1964, 'D': 1964, 'E': 1964, 'F': 1965, 'G': 1965, 'H': 1966, 'I': 1967, 'J': 1967, 'K': 1968, 'L': 1969 ,'M': 1969, 'N': 1970}

value, count = Counter(input_dict.values()).most_common(1)[0]
# in above code, `value` will hold value `1964`  <--- one you desire
#            and `count` will hold value `3`

使用中間字典(沒有導入)

這是另一個沒有導入任何模塊的 在這里,我使用dict創建我自己的計數器:

my_counter_dict = {}
for v in input_dict.values():
    my_counter_dict[v] = my_counter_dict.get(v, 0)+1

# Value hold by `my_counter_dict`:
#  {1963: 2, 1964: 3, 1965: 2, 1966: 1, 1967: 2, 1968: 1, 1969: 2, 1970: 1}

從上面的dict ,使用max函數提取具有最大值的鍵:

>>> max(my_counter_dict.iterkeys(), key=my_counter_dict.get)
1964

不使用中間字典(沒有導入)

這是另一種不創建中間字典的替代方法,但由於列表中每個元素的list.count導致列表的一次完整迭代,因此效率相對較低:

>>> values_list = list(input_dict.values())
>>> max(set(values_list), key=values_list.count)
1964

即使我建議你不需要導入任何東西,它的簡單任務:

input_dict = {'A': 1963, 'B': 1963,
    'C': 1964, 'D': 1964, 'E': 1964,
    'F': 1965, 'G': 1965, 'H': 1966,
    'I': 1967, 'J': 1967, 'K': 1968,
    'L': 1969 ,'M': 1969,
    'N': 1970}


track={}

for key,value in input_dict.items():
    if value not in track:
        track[value]=0
    else:
        track[value]+=1

print(max(track,key=track.get))

輸出:

1964

如果你真的堅持不進口任何東西。 考慮一下:

input_dict = {'A': 1963, 'B': 1963,
    'C': 1964, 'D': 1964, 'E': 1964,
    'F': 1965, 'G': 1965, 'H': 1966,
    'I': 1967, 'J': 1967, 'K': 1968,
    'L': 1969 ,'M': 1969,
    'N': 1970}

def most_prolific(input_dict):
    value_list = list(input_dict.values())

    #for each uniqute value in value_list, count the frequency, and return the max
    return max([(value_list.count(x),x) for x in set(value_list)])

print(most_prolific(input_dict)[1]) #returns 1964 in your example

其實很簡單。 如果你想要一個 2 行代碼,那么你可以使用:

>>> vals = list(input_dict.values())
>>> max(vals,key=vals.count)
1964

如果您想使用單行代碼,則不要將列表放在變量中,而是直接使用列表:

>>> max(list(input_dict.values()),key=list(input_dict.values()).count)
1964

您可以使用帶有key參數的max函數:

input_dict = {'A': 1963, 'B': 1963, 
'C': 1964, 'D': 1964, 'E': 1964,
'F': 1965, 'G': 1965, 'H': 1966,
'I': 1967, 'J': 1967, 'K': 1968,
'L': 1969 ,'M': 1969,
'N': 1970}
max_recurrence = max(input_dict.values(), key=lambda x:input_dict.values().count(x))

輸出:

1964

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM