4

我正在处理一个问题,要求我返回字典中频率最低的值,除了几个不同的计数之外,我似乎无法解决它,但字典中没有固定数量的值支票中提供。

例如,假设字典包含从学生姓名(字符串)到他们的年龄(整数)的映射。您的方法将返回出现频率最低的年龄。考虑一个包含以下键/值对的字典变量 d:

{'Alyssa':22,'Char':25,'Dan':25,'Jeff':20,'Kasey':20,'Kim':20,'Mogran':25,'Ryan':25,'史蒂夫':22}

三个人是 20 岁(Jeff、Kasey 和 Kim),两个人是 22 岁(Alyssa 和 Stef),四个人是 25 岁(Char、Dan、Mogran 和 Ryan)。因此,rareest(d) 返回 22,因为只有两个人是那个年龄。

有人介意给我指出正确的方向吗?谢谢!

4

7 回答 7

10

计算集合的成员是以下工作collections.Counter

d={'Alyssa':22, 'Char':25, 'Dan':25, 'Jeff':20, 'Kasey':20, 'Kim':20, 'Mogran':25, 'Ryan':25, 'Stef':22}
import collections
print collections.Counter(d.values()).most_common()[-1][0]
22
于 2013-11-14T17:41:14.123 回答
1

您可以为计数器创建一个空字典,然后遍历您拥有的字典并将 1 添加到第二个字典中的相应值,然后返回第二个字典中具有最小值的元素的键。

于 2013-11-14T17:38:34.537 回答
1
from collections import Counter
min(Counter(my_dict_of_ages.values()).items(),key=lambda x:x[1])

我想会做吗

于 2013-11-14T17:39:35.240 回答
1

您可以使用collections.Counter

d={'Alyssa':22, 'Char':25, 'Dan':25, 'Jeff':20, 'Kasey':20, 'Kim':20, 'Mogran':25, 'Ryan':25, 'Stef':22}
import collections
print collections.Counter(d.values()).most_common()[-1][0]

或者编写自己的函数:

def rarest(dict):
    values = dict.values()
    least_frequent = max(values)
    for x in set(values):
        if values.count(x) < least_frequent:
            least_frequent = x
    return {least_frequent:dict[least_frequent]}

>>> rarest({'Alyssa':22, 'Char':25, 'Dan':25, 'Jeff':20, 'Kasey':20, 'Kim':20, 'Mogran':25, 'Ryan':25, 'Stef':22})
{22:2}
于 2013-11-14T17:56:57.317 回答
0

您可以创建第二个字典,将第一个(年龄)中的值用作第二个中的键,并将第二个的值用作计数。然后对第二个的值进行排序并进行反向循环以获取关联的键(有几种方法可以通过将键列表和值列表视为 numpy 数组来有效地做到这一点)。

import numpy

d = {'Alyssa':22, 'Char':25, 'Dan':25, 'Jeff':20, 'Kasey':20, 'Kim':20, 'Mogran':25, 'Ryan':25, 'Stef':22}

def rarest(d):
    s = {}

    # First, map ages to counts.
    for key in d:
        if d[key] not in s:
            s[d[key]] = 1
        else:
            s[d[key]] += 1 # Could use a defaultdict for this.

    # Second, sort on the counts to find the rarest.
    keys = numpy.array(s.keys())
    values = numpy.array(s.values())
    ordering = np.argsort(values)
    return keys[ordering][0]

可能有一种更有效的方法可以做到这一点,但这似乎有效。

于 2013-11-14T17:37:43.387 回答
0
my_dict = {'Alyssa':22, 'Char':25, 'Dan':25, 'Jeff':20, 'Kasey':20, 'Kim':20, 'Mogran':25, 'Ryan':25, 'Stef':22}
values = my_dict.values()
most_frequent = 0
for x in set(values):
    if values.count(x) > most_frequent:
        most_frequent = x
print most_frequent

此代码使用该set()方法,该方法返回一个包含所有唯一元素的集合,即:

>> set([1, 2, 3, 4, 2, 1])
set([1, 2, 3, 4])

要从 dict 中提取所有值,您可以使用dict.values(). 同样,您有dict.keys()dict.items()

>> my_dict.keys()
['Char', 'Stef', 'Kim', 'Jeff', 'Kasey', 'Dan', 'Mogran', 'Alyssa', 'Ryan']

>> my_dict.values()
[25, 22, 20, 20, 20, 25, 25, 22, 25]

>> my_dict.items()
[('Char', 25),
 ('Stef', 22),
 ('Kim', 20),
 ('Jeff', 20),
 ('Kasey', 20),
 ('Dan', 25),
 ('Mogran', 25),
 ('Alyssa', 22),
 ('Ryan', 25)]
于 2013-11-14T17:46:16.347 回答
0

如果其他人更喜欢记住尽可能少的函数/属性名称和包,JadedTuna 的回答很好。这是我的首选:

val_count = {}
for k in d:
    if k in val_count.keys():
        val_count[k] += 1
    else:
        val_count[k] = 1
val_count = list(val_count.items())       # Convert dict to [(k1, v1), (k2, v2), ...]
val_count.sort(key=lambda tup: tup[1])    # Sorts by count. Add reverse=True if you'd like mode instead
val_count[0]
于 2018-07-23T19:09:38.180 回答