[Python]如何对带有两个变量的字符串进行排序?
你好,我对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[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 如果可能的话,我想对结果进行排序,这样每个玩家的分数从最高到最低排在第一位,然后是玩家。如果两名球员的积分持平,那么排名最低的球员将被排在第一位 因此,我希望
任何帮助都将不胜感激 请看以下示例:
如果您已经有了播放器对象或字典,您可以使用以下方法进行排序:
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']