按第一个值对元组列表排序



我希望按每个元组中的第一个值对列表进行排序,但是我的代码并没有产生任何真正的排序列表,尽管列表的顺序确实发生了变化。我的列表包含具有"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)

最新更新