我希望按每个元组中的第一个值对列表进行排序,但是我的代码并没有产生任何真正的排序列表,尽管列表的顺序确实发生了变化。我的列表包含具有"PlayerCode"值的元组,这是每个玩家的唯一键。"平均分"是指玩家每场比赛的平均得分。我希望按照"平均分"来排序这个列表,尽管我似乎做得不对。这是我的代码
def getKey(item):
return item[0]
def sortByPoints():
foundPlayers = []
with open ('PlayerList.csv') as csvfile:
reader = csv.DictReader(csvfile)
for row in reader:
foundPlayers.append((row['Average PTS'], row['PlayerCode']))
print(foundPlayers)
sortedPlayers = sorted(foundPlayers, key = getKey)
print (sortedPlayers)
就像我说的,这确实改变了列表的顺序,但不是我寻找的方式,我也看不到任何真正的模式,它已经改变了它。我正在使用python 3.4
下面是两个列表
的输出未分类的:[(' 7 ', ' 1 '), ' 8 ', ' 2 ', ' 4 ', ' 3 ',("28"、"4")("0","5")("18","6"),(‘10’,‘7’),(‘9’,‘8’),("10","9")("2","10")("4","11")("2","12")("3","13")("4"、"14"),(' 2 ',' 15 ')]
排序:[(' 0 ', ' 5 '),(‘10’,‘7’),("10","9")("18","6")("2","10")("2","12")("2","15")("28"、"4")("3","13")("4"、"3")("4","11")("4"、"14"),(' 7 ',' 1 '),(' 8 ',' 2 '),(‘9’,‘8’)]
您可以使用从内置模块operator
导入的itemgetter
示例代码:
from operator import itemgetter
tuples = [(10, 3), (1, 4), (5, 4)]
sorted_tuples = sorted(tuples, key=itemgetter(0))
print(sorted_tuples)
输出:
[(1, 4), (5, 4), (10, 3)]
问题是你有字符串,所以它按字母顺序排序。转换为整数:
foundPlayers.append((int(row['Average PTS']), int(row['PlayerCode'])))
row['Average PTS']
和row['Player Code']
返回字符串。Python将比较(可能)有意外结果的字符串
>>> '6' > '42'
True
转换row['Average PTS']
和row['Player Code']
使用int
。
您可以使用lambda
函数作为键来排序:
sorted(my_list, key=lambda x: (int(x[1]), int(x[0])))
:
-
list
将根据1
st索引的内容进行排序。如果值相同,则根据0
第12个索引对list
进行排序。 - 还需要将
tuple
中的值类型转换为int
。按字典顺序排序。这意味着,对于字符串值,'11'将出现在'2'之前。
下面是示例:
>>> my_list = [('7', '1'), ('8', '2'), ('4', '3'), ('28', '4'), ('0', '5'), ('18', '6'), ('10', '7'), ('9', '8'), ('10', '9'), ('2', '10'), ('4', '11'), ('2', '12'), ('3', '13'), ('4', '14'), ('2', '15')]
>>> sorted(my_list, key=lambda x: (int(x[1]), int(x[0])))
[('7', '1'), ('8', '2'), ('4', '3'), ('28', '4'), ('0', '5'), ('18', '6'), ('10', '7'), ('9', '8'), ('10', '9'), ('2', '10'), ('4', '11'), ('2', '12'), ('3', '13'), ('4', '14'), ('2', '15')]
以下是我的答案。我相信尽可能多地维护OP的原始代码,以尽可能少地做出假设。如果有字符串是必须的呢?同时,尽可能减少额外的进口。因此,我的解决方案是:
def sortByPoints():
foundPlayers = []
with open ('PlayerList.csv') as csvfile:
reader = csv.DictReader(csvfile)
for row in reader:
foundPlayers.append((row['Average PTS'], row['PlayerCode']))
print(foundPlayers)
sortedPlayers = sorted(foundPlayers, key=lambda x: float(x[0]))
print(sortedPlayers)
删除多余的getKey
功能,并使用lambda
代替整洁。使用float
只是为了以防将来可能需要它(因为您只用于比较;使用int
只会限制您,并且没有float
的优势)。
我也相信复制粘贴代码;)
仅供参考,改变方向:
sortedPlayers = sorted(foundPlayers, key=lambda x: float(x[0]), reverse=True)
还需要注意的是,如果目的确实只是为了整数,那么您应该按照每个人的建议,将元素转换为int
:
def sortByPoints():
foundPlayers = []
with open ('PlayerList.csv') as csvfile:
reader = csv.DictReader(csvfile)
for row in reader:
foundPlayers.append((int(row['Average PTS']), int(row['PlayerCode'])))
print(foundPlayers)
sortedPlayers = sorted(foundPlayers, key=lambda x: x[0])
print(sortedPlayers)