这是一个非常简单的解决方案,可能不是最有效的一个,但一个简单的(?)。
data = get_data()
freqs, numbers = {}, {}
for i in data:
freqs[i] = freqs.get(i, 0) + 1
for n, c in freqs.items():
numbers[c] = numbers.get(c, []) + [n]
counts = list(numbers.keys())
res = (numbers[min(counts)], numbers[max(counts)])
让我们来详细看看我们在上面的脚本,让我们开始 你给的例子数据,
In [1]: data = [13,12,11,13,14,13,7,11,13,14,12,14,14]
我们将用两个字典,
In [2]: freqs, numbers = {}, {}
第一个填充在data
上迭代,其关键是 单个数字data
及其值t他在数据中的每个 号码(见fotnote为freqs.get(…)
)
In [3]: for i in data: freqs[i] = freqs.get(i, 0) + 1
第二个是简单地将第一个的反转的频率,键是 的频率和的值是数字的列表与给定 频率。
In [4]: for n, c in freqs.items(): numbers[c] = numbers.get(c, []) + [n]
In [5]: numbers
Out[5]: {1: [7], 2: [12, 11], 4: [13, 14]}
在这一点上,我们需要的numbers
键列表,即 出现
In [6]: counts = list(numbers.keys())
,因为我们感兴趣的是最小和 的最大值出现
In [7]: [numbers[min(counts)], numbers[max(counts)]]
Out[7]: [[7], [13, 14]]
脚注:.get(key, default_value)
字典的方法 返回默认值,如果该字典中不存在该键,我们使用此功能以0
默认值将各个数字的出现次数 与[]
(void列表)相加以构建一个列出所有给定频率的数字的 。
对于“max occuring element”(aka。_mode_),看看这个问题:[查找列表模式](https://stackoverflow.com/questions/10797819/finding-the-mode-of -一个列表)。 –
[查找列表模式]的可能重复(https://stackoverflow.com/questions/10797819/finding-the-mode-of-a-list) – araknoid