2013-03-14 15 views
0

我正在使用python读取MySQL中的值,然后对列表进行排序。然后,我需要对列表进行排名并将其写回MySQL。我的代码是排序和等级列表python并使用python回写到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是rank1,25 rank2和17 rank3等...

哪里是我卡住..有没有人知道一个简单的方式来排名他们在python ...所以我可以把他们写回到MySQL ...

+0

http://docs.python.org/2/tutorial/datastructures.html – user7186 2013-03-14 17:37:25

回答

4
>>> [row[:-1] + (rank,) for rank, row in enumerate(sorted(rows, reverse=True), start=1)] 
    [(90L, 70L, 1), (25L, 78L, 2), (17L, 1L, 3)] 
  • enumerate(rows, start=1)返回返回(秩,行)的元组的列表,开始1
  • row[:-1]取所有项目,但最后从行(实际上剥离旧的等级)
  • row[:-1] + (rank,)连接该行的第一项和包含等级的1元组。

 

你为什么选择在所有的,如果你打算更换它的排名?

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) 
+0

嗨帕维尔,感谢您的帮助,我没想到他们一样,在MySQL的排序,这似乎是一个很大更优雅的方案!再次感谢! – DavidJB 2013-03-15 20:02:25

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)]