Pythonに従って合計ポイントをカウントする関数を作成するには?
例えば、
rank_list=[['Peter','Amy','John','Kitty'],['Amy','John','Kitty','Peter']]
1 位で 5 ポイント、2 位で 2 ポイント、3 位で 0 ポイント、最下位で 9 ポイントが与えられます。
人の合計点をカウントするリストが欲しい
Pythonに従って合計ポイントをカウントする関数を作成するには?
例えば、
rank_list=[['Peter','Amy','John','Kitty'],['Amy','John','Kitty','Peter']]
1 位で 5 ポイント、2 位で 2 ポイント、3 位で 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)]
You can use 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)]
逆リストをインデックスとして使用し (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