[Python]如何对带有两个变量的字符串进行排序?

[Python]如何对带有两个变量的字符串进行排序?,python,sorting,variables,Python,Sorting,Variables,你好,我对python有点陌生,所以请容忍我 我的python程序有以下几行: 打印“玩家1:+str(玩家1分) 打印“玩家2:+str(玩家2分) 打印“玩家3:+str(玩家3分) 打印“玩家4:+str(玩家4分) 玩家的分数是我的程序计算出来的,所以每次运行时都不一样 结果将产生: 球员1:3 球员2:4 球员3:3 球员4:5 如果可能的话,我想对结果进行排序,这样每个玩家的分数从最高到最低排在第一位,然后是玩家。如果两名球员的积分持平,那么排名最低的球员将被排在第一位 因此,我希望

你好,我对python有点陌生,所以请容忍我

我的python程序有以下几行:

打印“玩家1:+str(玩家1分)

打印“玩家2:+str(玩家2分)

打印“玩家3:+str(玩家3分)

打印“玩家4:+str(玩家4分)

玩家的分数是我的程序计算出来的,所以每次运行时都不一样

结果将产生:

球员1:3

球员2:4

球员3:3

球员4:5

如果可能的话,我想对结果进行排序,这样每个玩家的分数从最高到最低排在第一位,然后是玩家。如果两名球员的积分持平,那么排名最低的球员将被排在第一位

因此,我希望我的结果如下:

球员4:5

球员2:4

球员1:3

球员3:3


任何帮助都将不胜感激

请看以下示例:


如果您已经有了播放器对象或字典,您可以使用以下方法进行排序:

players.sort(key=lambda player: player.score, reverse=True)
如果不是,则处理数组并在每个“:”处拆分

样本:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

def main():
    "entry point"
    player_strings = ['Player 1:3', 'Player 2:4', 'Player 3:3', 'Player 4:5']
    players = []
    for player_string in player_strings:
        name, score = player_string.split(':')
        players.append({'name':name, 'score':score})
    players.sort(key=lambda player: int(player['score']), reverse=True)
    for player in players:
        print ('%s has a score of %s' % (player['name'], player['score']))

if __name__ == '__main__':
    main()
通过向list.sort方法传递“键函数”,可以自定义其排序方式

def sort_players(players):
    r"""Sort the players by points.

    >>> print sort_players('Player 1: 3\n'
    ...                    '\n'
    ...                    'Player 2: 4\n'
    ...                    '\n'
    ...                    'Player 3: 3\n'
    ...                    '\n'
    ...                    'Player 4: 5\n')
    Player 4: 5
    Player 2: 4
    Player 1: 3
    Player 3: 3
    """
    # split into a list
    players = players.split("\n")

    # filter out empty lines
    players = [player for player in players if player != '']

    def points(player_report):
        """Parse the number of points won by a player from a player report.

        A "player report" is a string like 'Player 2: 6'.
        """
        import re
        # Match the last string of digits in the passed report
        points = re.search(r'\d+$', player_report).group()
        return int(points)

    # Pass `points` as a "key function".
    # The list will be sorted based on the values it returns.
    players.sort(key=points, reverse=True)

    # Make the sorted list back into a string.
    return "\n".join(players)

假设“玩家报告”在列表中:

values = ['Player 1: 3','Player 2: 4','Player 3: 3','Player 4: 5']

values.sort(key=lambda s: [(-int(b),a) for a,b in (s.split(':'),)])

print values
导致

['Player 4: 5', 'Player 2: 4', 'Player 1: 3', 'Player 3: 3']
=============

Bob Loin说他想得到

玩家4:5,玩家2:4,玩家1:3,玩家3:3

丹尼尔的罗斯曼是否有效取决于治疗名单

我的解决方案给出了正确的结果。请参见第二个列表中的差异

values = ['Player 1: 3','Player 2: 4','Player 3: 3','Player 4: 5']

print '   ',values
print
print 'Dan',sorted(values, key=lambda s: s.split(': ')[1], reverse=True)
print 'eyq',sorted(values, key=lambda s: [(-int(b),a) 
                                          for a,b in (s.split(':'),)])

print '\n===================================\n'

values = ['Player 3: 3','Player 2: 4','Player 1: 3','Player 4: 5']

print '   ',values
print
print 'Dan',sorted(values, key=lambda s: s.split(':')[1], reverse=True)
print 'eyq',sorted(values, key=lambda s: [(-int(b),a) 
                                          for a,b in (s.split(': '),)])
结果

    ['Player 1: 3', 'Player 2: 4', 'Player 3: 3', 'Player 4: 5']

Dan ['Player 4: 5', 'Player 2: 4', 'Player 1: 3', 'Player 3: 3']
eyq ['Player 4: 5', 'Player 2: 4', 'Player 1: 3', 'Player 3: 3']

===================================

    ['Player 3: 3', 'Player 2: 4', 'Player 1: 3', 'Player 4: 5']

Dan ['Player 4: 5', 'Player 2: 4', 'Player 3: 3', 'Player 1: 3']
eyq ['Player 4: 5', 'Player 2: 4', 'Player 1: 3', 'Player 3: 3']

你需要告诉我们你尝试了什么以及失败的地方。你能在它们变成一个字符串之前对它们进行排序吗?当你分别拥有分数和玩家id时?这些玩家在你的代码中是如何表示的?这个答案真的很有帮助!然而,对于我的程序,我将其设置为“player1:+str(player1点)”,而不是仅将player1点分配给程序计算出的任何东西的“player1:3”。我将如何使用这个函数来接受我的字符串?@Bob Loin:不确定我是否理解你的意思。
points
函数使用的正则表达式将在给定的“玩家报告”中查找最后一串数字(
\d+
)。我使用术语“玩家报告”来指类似于
player2:6
的字符串。因此,只要你的
player1points
在报告字符串的末尾是一个正整数,
points
就会将其作为整数返回。很抱歉,在这个问题上,我是一个完全的新手。当我在我的程序中键入它时:print“player1:+str(player1points)),它将给我以下结果:player1:1。但是,当我输入:sort\u players('player1:+str(player1points)\n')时,它给出了错误:AttributeError:'NoneType'对象没有属性'group'。@Bob Loin:等等。。您实际上是在键入
sort\u players('player1:+str(player1points)\n')
?因此,第一(也是唯一)玩家报告行中的最后一个字符是
。如果玩家报告的最后一个字符是任何非数字,您将收到该错误消息,因为
points
希望报告以整数结尾。它不是特别健壮,但是使它健壮有点复杂。
    ['Player 1: 3', 'Player 2: 4', 'Player 3: 3', 'Player 4: 5']

Dan ['Player 4: 5', 'Player 2: 4', 'Player 1: 3', 'Player 3: 3']
eyq ['Player 4: 5', 'Player 2: 4', 'Player 1: 3', 'Player 3: 3']

===================================

    ['Player 3: 3', 'Player 2: 4', 'Player 1: 3', 'Player 4: 5']

Dan ['Player 4: 5', 'Player 2: 4', 'Player 3: 3', 'Player 1: 3']
eyq ['Player 4: 5', 'Player 2: 4', 'Player 1: 3', 'Player 3: 3']