如何编写一个函数,根据python计算总点数?如何编写一个计算python总点数的函数?
例如,
rank_list=[['Peter','Amy','John','Kitty'],['Amy','John','Kitty','Peter']]
人们得到5分为第一等级,2分,为第二,0点为第三和9点到最后。
我想要一个清单来计算总人数
如何编写一个函数,根据python计算总点数?如何编写一个计算python总点数的函数?
例如,
rank_list=[['Peter','Amy','John','Kitty'],['Amy','John','Kitty','Peter']]
人们得到5分为第一等级,2分,为第二,0点为第三和9点到最后。
我想要一个清单来计算总人数
这是否适合您?
In [277]: rank_list=[['Peter','Amy','John','Kitty'],['Amy','John','Kitty','Peter']]
In [278]: points = collections.defaultdict(int)
In [279]: for rank_lis in rank_list:
.....: for score, person in ran
random range rank_list
.....: for score, person in enumerate(rank_lis[::-1]):
.....: points[person] += score
.....:
In [280]: points.items()
Out[280]: [('Amy', 5), ('John', 3), ('Kitty', 1), ('Peter', 3)]
一个更有效的解决方案:
In [285]: rank_list=[['Peter','Amy','John','Kitty'],['Amy','John','Kitty','Peter']]
In [286]: for rank_lis in rank_list:
for score, person in enumerate(rank_lis, -3):
points[person] -= score
.....:
In [287]: points.items()
Out[287]: [('Amy', 5), ('Peter', 3), ('Kitty', 1), ('John', 3)]
您可以使用defaultdict
: -
rank_list=[['Peter','Amy','John','Kitty'],['Amy','John','Kitty','Peter']]
my_dict = {0:3, 1:2, 2:1, 3:0} # Have a mapping from index to score
from collections import defaultdict
ranking = defaultdict(int)
for elem in rank_list:
for index, value in enumerate(elem):
ranking[value] += my_dict[index]
print ranking.items()
OUTPUT: -
[('Amy', 5), ('Kitty', 1), ('Peter', 3), ('John', 3)]
+1了正确的解决方案,但是,这并不规模。如果有'N >> 3'等级会怎么样?你必须写一个非常大的'my_dict' – inspectorG4dget
@ inspectorG4dget ..是的,在这种情况下,我们必须在继续之前从'given'字典中创建这个排名字典。但是,你的第二种方式比这更好。 :) –
假设点是线性的(pos 0获得n个点,pos 1获得n-1个点,pos n获得n-n = 0),您可以使用算术而不是字典。 '排名[值] + =(最高分 - 指数)' – Tim
我们荷兰国际集团的反向列表作为索引(因为0 = 3,3 = 0,等),并将其保存到一个词典:
d = {}
for list in rank_list:
for name in list:
if name in d:
d[name] = d[name] + list[::-1].index(name)
else:
d[name] = list[::-1].index(name)
list[::-1]
输出反向列表。另外,您还可以通过打印d['Peter']
来获得分数。
它看起来像collections.Counter工作:
from collections import Counter
rank_list=[['Peter','Amy','John','Kitty'],['Amy','John','Kitty','Peter']]
rank_by_place = (3, 2, 1, 0)
ranks = Counter()
for record in rank_list:
for name, rank in zip(record, rank_by_place):
ranks.update({name: rank})
print ranks.most_common() # ordered by rank
+1就像第二个方式:) –