首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >元组列表中的多数及其平均值

元组列表中的多数及其平均值
EN

Stack Overflow用户
提问于 2017-07-14 19:18:21
回答 5查看 585关注 0票数 0

假设下面的元组列表表示来自3种不同方法的情绪估计:

代码语言:javascript
运行
复制
[('pos', 0.2), ('neu', 0.1), ('pos', 0.4)]

我想知道找到多数人情绪的最有效方法是什么,并为此计算其平均值,即:

代码语言:javascript
运行
复制
result=('pos', 0.3)

谢谢

EN

回答 5

Stack Overflow用户

发布于 2017-07-14 19:29:41

代码语言:javascript
运行
复制
import itertools

l = [('pos', 0.2), ('neu', 0.1), ('pos', 0.4)]

您可以首先按情感进行分组(请注意,它们需要首先进行排序)

代码语言:javascript
运行
复制
sentiments = [list(j[1]) for j in itertools.groupby(sorted(l), lambda i: i[0])]
# sentiments = [[('neu', 0.1)], [('pos', 0.2), ('pos', 0.4)]]

然后找出哪种情绪最常见(aka有最长的一组)

代码语言:javascript
运行
复制
majority = max(sentiments, key=len)
# majority = [('pos', 0.2), ('pos', 0.4)]

最后计算平均值

代码语言:javascript
运行
复制
values = [i[1] for i in majority]
average = (majority[0][0], sum(values)/len(values))
# average = ('pos', 0.30000000000000004)
票数 2
EN

Stack Overflow用户

发布于 2017-07-14 19:31:01

使用collectionsstatistics模块,您可以做到这一点:

代码语言:javascript
运行
复制
from collections import Counter
from statistics import mean

lst = [('pos', 0.2), ('neu', 0.1), ('pos', 0.4)]
count = Counter(item[0] for item in lst)  # Counter({'pos': 2, 'neu': 1})
maj = count.most_common(1)[0][0]          # pos
mn = mean(item[1] for item in lst if item[0] == maj)
result = (maj, mn)

print(result)  # ('pos', 0.30000000000000004)

尽管您正在寻找效率,但我更喜欢CoryKramer's answer

票数 1
EN

Stack Overflow用户

发布于 2017-07-14 19:26:44

代码语言:javascript
运行
复制
import collections

reports = [('pos', 0.2), ('neu', 0.1), ('pos', 0.4)]

oracle = collections.defaultdict(list)
for mood, score in reports:
    oracle[mood].append(score)

counts = {mood: len(scores) for mood, scores in oracle.items()}

mood = max(counts) # gives `'pos'`

sum(oracle[mood]) / len(oracle[mood]) # gives 0.3
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45101690

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档