【问题标题】:Mode of a column in list of lists列表列表中列的模式
【发布时间】:2019-12-28 00:18:55
【问题描述】:

我有一个列表列表

distances = [[female, 1],
[female, 2],  
[male, 3],
[male, 4],
[female, 5]] 

如何获取第一列到前 k 个列表的模式(元素中的最大出现次数)。
比如,如果 k = 3,它应该返回 'female',因为女性出现两次,而男性出现一次

【问题讨论】:

  • 你说的第一列的模式是什么意思?您是指第一行 k 的最大计数吗?您对k=3 的输出是female,因为它出现了两次,而male 只出现了一次?更具体
  • @Tomerikoo 是频率最高的元素
  • @Tomerikoo 该链接没有完全回答这个问题,我不是在寻找所有频率计数只是特定列的模式。还有所有元素的答案,而不仅仅是一列。

标签: python list


【解决方案1】:

你可以试试这样的:

distances = [['female', 1],
['female', 2],  
['male', 3],
['male', 4],
['female', 5]]

def get_mode(k_max):
    l = [d[0] for d in distances[:k_max]] # make list of elements up to given k_max
    return max(set(l), key=l.count) # return most frequent element

get_mode(3)
'female'

这假定列表列表是有序的,如您的示例所示。

【讨论】:

  • 更简单:l = [d[0] for d in distances[:k_max]]
【解决方案2】:

您可以使用内置统计模块的模式功能,operator.itemgetter 将允许轻松访问每个列表中的第一个元素。

from statistics import mode
from operator import itemgetter

distances = [['female', 1], ['female', 2], ['male', 3], ['male', 4], ['female', 5]]
k = 3

print(mode(map(itemgetter(0), distances[:k])))
#'female'

您还可以使用collections.Counter 获取每种性别的计数。

Counter(map(itemgetter(0), distances[:k])))
#Counter({'female': 3, 'male': 2})

您也可以在上面使用max 并得出相同的结果:

sexes = Counter(map(itemgetter(0), distances[:k]))
print(max(sexes, key=sexes.get))
#'female'

【讨论】:

  • 这是有效的,但我如何添加范围,我的意思是最多前 k 行/列表?
  • 你漏掉了k,但很容易添加:k = 3; print(... distances[:k])))
  • 在我的答案中添加了k,还添加了 counter 作为另一种解决方案,因为它对其他情况很有用。
【解决方案3】:

这应该可行,

import statistics as stats

female = 'f'
male = 'm'

distances = [[female, 1],
[female, 2],  
[male, 3],
[male, 4],
[female, 5]] 
distmode = []
k = 0
for i in distances:
    distmode.append(i[0]) #take first entry in each list
    k += 1
    if k >= 3: #break at k=3
        break
print(stats.mode(distmode))

【讨论】:

  • 更简单:k = 3; distmode = [d[0] for d in distances[:k]]
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-06-15
  • 1970-01-01
  • 2012-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多