2016-11-07 116 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) 
相關問題