2016-11-07 83 views
0

我希望按每个元组中的第一个值对列表进行排序,但是我的代码不会生成任何实际的排序列表,尽管列表的顺序确实发生了变化。我的列表包含的元组的值为'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) 

就像我说的,这确实改变了列表的顺序,但没有办法即时寻找,我也不能看到任何真正的模式,它已经将其改为到。 我使用蟒3.4

这里是两个列表

未排序的输出: [( '7', '1'),( '8', '2'),( '4' ('10','4'),('0','5'),('18','6'),('10','7'), ('''','8'),('10','9'),('2','10'),('4','11'), ('0','5'),('4','14'),('2','15')]

排序: [ ('10','9'),('18','6'),('2','10'),('2','12'), ('4','3'),('4','4'),('4','3'),('4','3'), ('8','2'),('9','8')]

+2

请注意,按第一个v alue是元组的**默认排序**。除此之外,没有[mcve],目前还不清楚你的问题是什么。 – jonrsharpe

+1

你想根据整数值进行排序,它们现在是字符串,所以你可以改变getKey函数来返回int(item [0]) – chatton

+0

如果你真的想要,你可以使用字符串,只需排序使用'float' - 参见http://stackoverflow.com/a/17474264/2178980(实际上,上面的评论也可以做到这一点) – Eugene

回答

0

问题是你有字符串,所以它按字母顺序排序。转换为整数:

foundPlayers.append((int(row['Average PTS']), int(row['PlayerCode']))) 
0

row['Average PTS']row['Player Code']返回字符串。 Python会比较字符串使用int(可能)令人惊讶的结果

>>> '6' > '42' 
True 

转换row['Average PTS']row['Player Code']

0

可以使用itemgetter从内置在模块进口operator

示例代码:

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

你可以使用lambda功能键分类为:

sorted(my_list, key=lambda x: (int(x[1]), int(x[0]))) 

这里:

  • list将基于在1 ST指数的内容进行排序。如果值相同,list将根据0th指数排序。
  • 此外,您还需要将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')] 
0

这里就是我的回答。我相信尽可能维护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) 
相关问题