首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用itertools对range进行迭代?

如何使用itertools对range进行迭代?
EN

Stack Overflow用户
提问于 2019-12-17 02:05:02
回答 4查看 70关注 0票数 0

考虑以下列表中的4个元组:

代码语言:javascript
复制
players_score  = [ ('Joe', 100, 34, 38, 90, 67, 3, 10),
             ('Bob', 90, 38, 4, 100, 60, 4, 11),
             ('May', 80, 36, 40, 91, 70, 2, 12),
                ('Anna', 95, 32, 36, 92, 68, 8, 13) ]

球员们已经打了7场比赛了。在第一场比赛中,乔以100分获胜。

我想根据以下内容给每个玩家(每一场比赛)打分:

代码语言:javascript
复制
First/best player: 5 points
Second player: 3 points
Third player: 1 point
Fourth player: -1 point -> But 0 points is what I like to assign the fourth player of each game.

到目前为止,我的代码如下:

代码语言:javascript
复制
from itertools import zip_longest as y

zipped = list(y(*[game_score for _, *game_score in players_score]))
tup = list(sorted(i, reverse=True) for i in zipped)
score_dict = {}
for player, *game_score in players_score:
    tmp = []
    for i,j in zip(game_score, tup):
        tmp.append(5-2*j.index(i))
    tot_score = sum(tmp)
    score_dict[player] = tot_score

print("The overall scores are: ", sorted(score_dict.items(), key=lambda kv: (kv[1], kv[0]), reverse=True))

因此,我的代码将-1点应用于每个游戏的第四个玩家,但我希望第四个玩家只获得0个零点。我正在努力应用一个范围(0:3)或其他方法,通过这些方法,我可以跳过第四个玩家的得分,因为那个玩家只获得0分。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2019-12-17 02:51:58

我会以不同的方式设置它。也就是说,有不止一种方法可以做到这一点。我要做的第一件事是把players_score列表变成一个更漂亮的集合,就像字典一样--这样工作起来就更有趣了。

基本上,我们迭代我们的“轮次”(游戏),并根据玩家在本轮中的得分对玩家姓名进行排序(本轮的获胜者排在第一位)。然后,我们用他们应得的奖励(分数)对排序后的球员姓名进行zip,并使用球员姓名作为关键字来更新我们的collections.Counter集合。

代码语言:javascript
复制
from collections import Counter

players_score = [
    ("Joe", 100, 34, 38, 90, 67, 3, 10),
    ("Bob", 90, 38, 4, 100, 60, 4, 11),
    ("May", 80, 36, 40, 91, 70, 2, 12),
    ("Anna", 95, 32, 36, 92, 68, 8, 13)
]

original_scores = {player: scores for player, *scores in players_score}

def iter_score(player):
    for score in original_scores[player]:
        yield player, score

score_rewards = [5, 3, 1, 0]

overall_scores = Counter()

for current_round in zip(*map(iter_score, original_scores)):
    sorted_players = map(lambda tpl: tpl[0], sorted(current_round, key=lambda tpl: tpl[1], reverse=True))
    for player, score in zip(sorted_players, score_rewards):
        overall_scores.update({player: score})

print("The overall scores:")
for player, score in overall_scores.most_common():
    print(f"{player}: {score}")

输出:

代码语言:javascript
复制
The overall scores:
Anna: 20
May: 17
Bob: 15
Joe: 11
票数 0
EN

Stack Overflow用户

发布于 2019-12-17 02:22:57

您可以更改评分函数:

代码语言:javascript
复制
tmp.append(5-2*j.index(i) if 5-2*j.index(i) > 0 else 0)

因此,如果存在负值,则将分数设置为0

票数 0
EN

Stack Overflow用户

发布于 2019-12-17 02:23:02

一个非常简单的解决方案

代码语言:javascript
复制
for i,j in zip(game_score, tup):
        score_var = 5-2*j.index(i)
        if (score_var < 0):
              score_var = 0
        tmp.append(score_var)

这将确保没有玩家会获得负分。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59362077

复制
相关文章

相似问题

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