有效地更改列表中的值

2024-06-16 11:55:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个列表如下:

[['B Borg', '3', '3', '1.0'], ['F Perry', '7', '8', '0.875'], ['R Nadal', '3', '5', '0.6']]

我想让用户选择其中的两个网球选手玩一个模拟网球比赛,其中的赢家是随机选择的。如果我选择博格和佩里相遇,博格随机获胜。最终结果如下:

[['B Borg', '4', '4', '1.0'], ['F Perry', '7', '9', '0.875'], ['R Nadal', '3', '5', '0.6']]

列表中的第一个元素是名称,第二个元素是赢得的比赛,第三个元素是总比赛数,第四个元素是获胜百分比。你知道吗

有什么“整洁”的方法吗?我试过使用多个if-elif-else块。当然可以,但文字太多了。你知道吗


Tags: 方法用户名称元素列表ifborgelse
2条回答

另一个类解决方案(基本上与adsmith的相同,但我已经在键入它了,所以很好。)

import random

class Player:
    def __init__(self, name):
        self.name = name
        self.wins = 0
        self.games = 0
    def win(self):
        self.wins += 1
        self.games += 1
    def lose(self):
        self.games += 1
    def __str__(self):
        win_pct = self.wins/self.games
        return '{:10} {:10} {:10} {:10.2}'.format(self.name, self.wins, self.games, win_pct)

def play_game(p1, p2):
    winner, loser = random.sample([p1, p2], 2)
    winner.win()
    loser.lose()

players = [Player(name) for name in ['B Borg', 'F Perry', 'R Nadal']]

for _ in range(20):
    play_game(*random.sample(players, 2))
for player in players:
    print(player)

示例结果:

B Borg              7         15       0.47
F Perry             7         14        0.5
R Nadal             6         11       0.55

使用类!!你知道吗

class TennisPlayer(object):
    def __init__(self,name,wins=0,games_played=0,win_pct=None):
        self.name = name
        self.wins = wins
        self.games_played = games_played

        # Note that although I do take win_pct as a parameter, I never use
        # it anywhere. This trick may be useful for you if you end up maintaining
        # code someone else has written and don't need part of their data
        # structure anymore, but don't feel like refactoring code is worth the time

    @property
    def win_pct(self):
        return self.wins/self.games_played

    # as per lanzz, the @property token basically makes this a function that can
    # be called like an instance variable.
    #
    # >>> player = TennisPlayer("Foo Bar",2,3) # 2 wins 1 loss
    # >>> player.win_pct
    # 0.6666666666666666
    #
    # You could probably make this prettier using string formatting.
    # Something like return "{:.2f}%".format(self.wins/self.games_played*100)
    # but it will make data manipulation much harder. Consider writing
    # a TennisPlayer.print_stats() function that will just pretty print
    # all the stats to stdout

    def win_game(self,other):
        self.games_played += 1
        self.wins += 1
        other.games_played +=1

lst = [['B Borg', '3', '3', '1.0'], ['F Perry', '7', '8', '0.875'], ['R Nadal', '3', '5', '0.6']]

tennisplayers = [TennisPlayer(*player) for player in lst]

# randomly choose B Borg (tennisplayers[0]) and F Perry (tennisplayers[1])

tennisplayers[0].win_game(tennisplayers[1])

这方面的实现有你所能想象的那么多。最好的方法(在我看来,无论如何)是实现一个TennisMatch类:

class TennisMatch(object):
    def __init__(self,player1,player2):
        if type(player1) == list:
            # implement special handlers for doubles games
        else:
            self.player1 = player1
            self.player2 = player2

    def play_match(self):
        # do some stuff here
        # to determine who wins and
        # who goes crying to mommy
        for player in [player1,player2]:
            if player == winner: player.wins += 1
            player.games_played += 1

然后您可以忽略我放在TennisPlayer类中的def win_game,因为它实际上只是一个实现较差的setter。这样效果更好。你知道吗

相关问题 更多 >