使用Python排序和排名列表,并写入MySQL

0 投票
2 回答
1491 浏览
提问于 2025-04-17 19:07

我正在用Python从MySQL读取数据,然后对一个列表进行排序。接下来,我需要给这个列表排名,并把结果写回MySQL。我的代码是:

获取列表

cursor.execute ("SELECT winnings, user, rank FROM round_lb WHERE r_id = 5")
round_test = cursor.fetchall()

返回结果

((90L, 70L, 0L), (17L, 1L, 0L), (25L, 78L, 0L))

对列表进行排序(让最高的奖金在最前面)

print sorted(round_test, reverse =True)
[(90L, 70L, 0L), (25L, 78L, 0L), (17L, 1L, 0L)]

现在我想给排名字段赋值,比如90是第一名,25是第二名,17是第三名,等等……

但我在这里遇到了困难……有没有人知道在Python中简单的排名方法……这样我就可以把它们写回MySQL了……

2 个回答

0

如果你只需要一个顺序排列,其实你已经在列表中元组的位置上得到了这个顺序:

sorted_list = sorted(round_test, reverse =True)
# [(90L, 70L, 0L), (25L, 78L, 0L), (17L, 1L, 0L)]
ranked_list = []
for position, row in enumerate(sorted_list):
    ranked_list.append(tuple(row[0:2] + [position])) # replaces the 3rd row member
# ranked_list
# [(90L, 70L, 1), (25L, 78L, 2), (17L, 1L, 3)]
4
  • enumerate(rows, start=1) 会返回一个包含元组的列表,每个元组里有(排名,行),并且排名是从 1 开始的。
  • row[:-1] 会取出行中的所有项,除了最后一项(实际上是去掉了旧的排名)。
  • row[:-1] + (rank,) 会把行中的前面项和一个只包含排名的元组连接在一起。
>>> [row[:-1] + (rank,) for rank, row in enumerate(sorted(rows, reverse=True), start=1)]
    [(90L, 70L, 1), (25L, 78L, 2), (17L, 1L, 3)]

 

如果你打算替换排名,为什么还要选取排名呢?

cursor.execute ("SELECT winnings, user FROM round_lb WHERE r_id = 5")
rows = cursor.fetchall()
for rank, (winnings, user) in enumerate(sorted(rows, reverse=True), start=1):
    params = (winnings, user, rank)
    cursor.execute("INSERT INTO round_lb (winnings, user, rank) VALUES (%s, %s, %s)", params)

 

那为什么不在 MySQL 中排序呢?

cursor.execute ("SELECT winnings, user FROM round_lb WHERE r_id = 5 ORDER BY winnings DESC")
rows = cursor.fetchall()
for rank, (winnings, user) in enumerate(rows, start=1):
    params = (winnings, user, rank)
    cursor.execute("INSERT INTO round_lb (winnings, user, rank) VALUES (%s, %s, %s)", params)

撰写回答