- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有两个排序的字典,即它们现在表示为列表。我想检索每个列表中每个元素的排名位置并将其存储在一个变量中,以便最终我可以计算两个列表中每个元素的排名分数的加权平均值。这是一个例子。
dict1 = {'class1': 15.17, 'class2': 15.95, 'class3': 15.95}
sorted_dict1 = [('class1', 15.17), ('class2', 15.95), ('class3', 15.95)]
sorted_dict2 = [('class2', 9.10), ('class3', 9.22), ('class1', 10.60)]
到目前为止,我可以检索列表中每个元素的排名位置并打印排名,但是当我尝试计算排名分数的加权平均值时,即 [(w1*a + w2*b)/(w1+w2) )],其中“a”是sorted_dict1中的排名位置,“b”是sorted_dict2中的排名位置,我得到的数字不是正确的加权平均数。
尝试了各种事情,这里是一个:
for idx, val in list(enumerate(sorted_dict1, 1)):
for idx1, val1 in list(enumerate(sorted_dict2, 1)):
position_dict1 = idx
position_dict2 = idx1
weighted_average = float((0.50*position_dict1 + 0.25*position_dict2))/0.75
print weighted_average
我也没有考虑如果两个类在列表中排名相同会发生什么。我也将很感激得到任何有关这方面的提示/帮助。
我认为我可能需要创建一个函数来解决这个问题,但我也没有走得太远。
任何帮助以及解释代码的注释都会很棒。
所以我想计算列表中元素排名位置的加权平均值。例如的加权平均值:
1 类:加权平均值 = ((0.50 * 1) + (0.25 * 3))/0.75 = 1.5
2级:那么加权平均值 = ((0.50 *2)+(0.25*1))/0.75 = 1.6666..7
谢谢!
最佳答案
我采取了简单的路线,并给同等分数的类(class)下一个整数排名,所以 class3
和class2
两者均在 sorted_dict1
中排名第 2
#!/usr/bin/env python
#Get the ranks for a list of (class, score) tuples sorted by score
#and return them in a dict
def get_ranks(sd):
#The first class in the list has rank 1
k, val = sd[0]
r = 1
rank = {k: r}
for k, v in sd[1:]:
#Only update the rank number if this value is
#greater than the previous
if v > val:
val = v
r += 1
rank[k] = r
return rank
def weighted_mean(a, b):
return (0.50*a + 0.25*b) / 0.75
sorted_dict1 = [('class1', 15.17), ('class2', 15.95), ('class3', 15.95)]
sorted_dict2 = [('class2', 9.10), ('class3', 9.22), ('class1', 10.60)]
print sorted_dict1
print sorted_dict2
ranks1 = get_ranks(sorted_dict1)
ranks2 = get_ranks(sorted_dict2)
print ranks1
print ranks2
keys = sorted(k for k,v in sorted_dict1)
print [(k, weighted_mean(ranks1[k], ranks2[k])) for k in keys]
输出
[('class1', 15.17), ('class2', 15.949999999999999), ('class3', 15.949999999999999)]
[('class2', 9.0999999999999996), ('class3', 9.2200000000000006), ('class1', 10.6)]
{'class2': 2, 'class3': 2, 'class1': 1}
{'class2': 1, 'class3': 2, 'class1': 3}
[('class1', 1.6666666666666667), ('class2', 1.6666666666666667), ('class3', 2.0)]
<小时/>
在评论中我提到有一个很好的方法来创建 weighted_mean()
具有自定义权重的函数。当然,我们可以将权重作为附加参数传递给 weighted_mean()
,但这会调用 weighted_mean()
比需要的更加困惑,使程序更难以阅读。
技巧是使用一个函数,该函数将自定义权重作为参数并返回所需的函数。从技术上讲,这样的函数生成函数称为 closure .
这里有一个关于如何做到这一点的简短演示。
#!/usr/bin/env python
#Create a weighted mean function with weights w1 & w2
def make_weighted_mean(w1, w2):
wt = float(w1 + w2)
def wm(a, b):
return (w1 * a + w2 * b) / wt
return wm
#Make the weighted mean function
weighted_mean = make_weighted_mean(1, 2)
#Test
print weighted_mean(6, 3)
print weighted_mean(3, 9)
输出
4.0
7.0
<小时/>
这是上面第一个程序的更新版本,它处理任意数量的sorted_dict列表。它使用原来的get_ranks()
函数,但它使用比上面的示例稍微复杂的闭包来对数据列表(或元组)进行加权平均值。
#!/usr/bin/env python
''' Weighted means of ranks
From https://stackoverflow.com/q/29413531/4014959
Written by PM 2Ring 2015.04.03
'''
from pprint import pprint
#Create a weighted mean function with weights from list/tuple weights
def make_weighted_mean(weights):
wt = float(sum(weights))
#A function that calculates the weighted mean of values in seq
#weighted by the weights passed to make_weighted_mean()
def wm(seq):
return sum(w * v for w, v in zip(weights, seq)) / wt
return wm
#Get the ranks for a list of (class, score) tuples sorted by score
#and return them in a dict
def get_ranks(sd):
#The first class in the list has rank 1
k, val = sd[0]
r = 1
rank = {k: r}
for k, v in sd[1:]:
#Only update the rank number if this value is
#greater than the previous
if v > val:
val = v
r += 1
rank[k] = r
return rank
#Make the weighted mean function
weights = [0.50, 0.25]
weighted_mean = make_weighted_mean(weights)
#Some test data
sorted_dicts = [
[('class1', 15.17), ('class2', 15.95), ('class3', 15.95), ('class4', 16.0)],
[('class2', 9.10), ('class3', 9.22), ('class1', 10.60), ('class4', 11.0)]
]
print 'Sorted dicts:'
pprint(sorted_dicts, indent=4)
all_ranks = [get_ranks(sd) for sd in sorted_dicts]
print '\nAll ranks:'
pprint(all_ranks, indent=4)
#Get a sorted list of the keys
keys = sorted(k for k,v in sorted_dicts[0])
#print '\nKeys:', keys
means = [(k, weighted_mean([ranks[k] for ranks in all_ranks])) for k in keys]
print '\nWeighted means:'
pprint(means, indent=4)
输出
Sorted dicts:
[ [ ('class1', 15.17),
('class2', 15.949999999999999),
('class3', 15.949999999999999),
('class4', 16.0)],
[ ('class2', 9.0999999999999996),
('class3', 9.2200000000000006),
('class1', 10.6),
('class4', 11.0)]]
All ranks:
[ { 'class1': 1, 'class2': 2, 'class3': 2, 'class4': 3},
{ 'class1': 3, 'class2': 1, 'class3': 2, 'class4': 4}]
Weighted means:
[ ('class1', 1.6666666666666667),
('class2', 1.6666666666666667),
('class3', 2.0),
('class4', 3.3333333333333335)]
这是 get_ranks()
的替代版本如果两个或多个类在列表中排名相同,则跳过排名数字
def get_ranks(sd):
#The first class in the list has rank 1
k, val = sd[0]
r = 1
rank = {k: r}
#The step size from one rank to the next. Normally
#delta is 1, but it's increased if there are ties.
delta = 1
for k, v in sd[1:]:
#Update the rank number if this value is
#greater than the previous.
if v > val:
val = v
r += delta
delta = 1
#Otherwise, update delta
else:
delta += 1
rank[k] = r
return rank
这是使用 get_ranks()
的替代版本的程序的输出:
Sorted dicts:
[ [ ('class1', 15.17),
('class2', 15.949999999999999),
('class3', 15.949999999999999),
('class4', 16.0)],
[ ('class2', 9.0999999999999996),
('class3', 9.2200000000000006),
('class1', 10.6),
('class4', 11.0)]]
All ranks:
[ { 'class1': 1, 'class2': 2, 'class3': 2, 'class4': 4},
{ 'class1': 3, 'class2': 1, 'class3': 2, 'class4': 4}]
Weighted means:
[ ('class1', 1.6666666666666667),
('class2', 1.6666666666666667),
('class3', 2.0),
('class4', 4.0)]
关于python - 检索各个列表中元素的排名,计算其排名分数的加权平均值 Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29413531/
我正在查看下面的示例代码, r element frequency and column name 并且想知道除了r中的排名和频率之外,是否有任何方法可以显示每列中每个元素的索引。因此,例如,所需的输
我有下表按 Id、Year DESC 排序 ID 年份有效 1 2011 1 1 2010 1 1 2009 0 1 2002 1 4 2013 1 4 2012 1 4 2011 1 等等。 我想要
鉴于此数据 Type Time Outcome Wanted Result 1 8:00 1 1 1 9:00 1 1 1 10:00 1 1 0
我正在寻找一种对两个句子进行排名/匹配的方法。 例如,取以下2个例句。 这是一个简短的句子。 这是一个包含很多单词的长句子。 我的新句子是这是一个句子。 我想将我的新句子与现有句子进行比较。我的新句子
我是 scikit 新手,我正在按照此处的示例 http://scikit-learn.org/stable/tutorial/text_analytics/working_with_text_dat
我有一张 table : r_user | r_points | -------------------- user1 | 12 | user2 | 124 | use
我需要获得顶级玩家、给定玩家的排名以及与该给定玩家排名相关的少数玩家。 为了更清楚地解释,下表是我想要的,它显示了得分最高的 3 名玩家、给定玩家的排名 (id=11) 以及得分略高于和低于该给定玩家
我正在尝试创建一个排名(排名)查询。 我使用表users、schedule 和picks来计算排名。然而,这样做的缺陷是,如果用户未提交任何选择,则该用户将不会出现在排名中。 下面的查询返回所有已提交
这个问题已经有答案了: 已关闭10 年前。 Possible Duplicate: High score system from my iphone game 我的查询是: $sql = "SELEC
我有一个玩家表和MatchUps表。 MatchUps 表具有一个 winner_id 列和一个 loser_id 列。我可以根据一次查询的胜率获得排名/排名吗?如果我能为每个玩家返回这样的东西,那就
我正在尝试创建一个排名/阶梯系统,其中排名最高的氏族 (1) 应位于顶部,排名为 2 的氏族应位于顶部,依此类推。但我无法让它工作......我尝试了不同的方法: PHP: $sql = mysql_
我需要一份游戏中排名最高的玩家列表。排名是即时计算的,数据取自两个表。我设法以正确的方式对它们进行排序,但是@rank:=0 -> @rank:=@rank+1 技巧,其中一个名为 rank 的附加字
下周末我们将进行一场包含 3 项资格赛(半决赛和决赛)的比赛。只有最好的 15 名参赛者才能参加半决赛。只有最好的 6 人才能参加总决赛。 在资格考试中,每项资格考试的分数从 0 到 100 不等 我
我正在尝试找出对我的产品进行加权的最佳方式,以及它们应该以何种顺序出现在主页等地方。 我想处理四个指标并将其转化为排名: 购买产品 产品有多久了(以天为单位) 产品被保存了多少次 产品被浏览了多少次
使用 @N=@N + 1 的经典技巧来获取某些有序列上的项目排名。现在在订购之前,我需要通过将它与其他表内部连接来从基表中过滤掉一些值。所以查询看起来像这样 -: SET @N=0; SELECT
我需要一些帮助来处理在 MySQL 中排名时的关系。例如: 播放器 |积分 玛丽:90 鲍勃:90 吉姆:65 凯文:12 Bob 和 Mary 应该都排名第一。吉姆应该是#3。凯文应该是#4。 My
我正在寻找一种算法,该算法可以为我提供具有特定强度的下一个排列。长度为 n 的排列由元素 (1,2,3,...n) 定义 排列的强度是多少? 长度为 10 的排列的强度定义为 |a1-a2|+|a2-
我正在编写一个具有信誉组件的电子商务引擎。我希望用户能够对项目进行评论和评分,并能够对评论进行评分。 用于根据“最佳”评论对项目进行排序的最佳算法是什么?它必须根据给出最佳评论的人获得的质量评论数量进
我有一个按游戏结果填满游戏的数据库表,想知道我是否可以计算以下内容: GP(玩过的游戏) 获胜 失败 积分(每胜2分,每负1分) 这是我的表结构: CREATE TABLE `results` (
我有一个 users 表,其中有一列名为 money_sent。我想按 money_sent 降序排列此表,然后找出特定用户的“排名”。 例如,只有 111 人比用户 12392 花费更多的钱,因此他
我是一名优秀的程序员,十分优秀!