2015-11-10 180 views
0

我想比較列表中的一個元素。我達到了我的目標,但它不是一個寫得很好的代碼。請看我的代碼,並給我一些建議。順便說一句,我有幾個其他問題Python 3:比較同一列表中的兩個元素

players_list = ({'player_name': 'Tom', 
       'player_flag': 'is_human', 
       'player_decision': None, 
       'player_points': 1} 

       {'player_name': 'Peter', 
       'player_flag': 'is_computer', 
       'player_decision': None, 
       'player_points': 2} 

       {'player_name': 'John', 
       'player_flag': 'is_computer', 
       'player_decision': None, 
       'player_points': 0.5} 

       {'player_name': 'Greg', 
       'player_flag': 'is_computer', 
       'player_decision': None, 
       'player_points': 2} 
       ) 

players_list = sorted(players_list, key = lambda k: k['player_points'], reverse = True)) #(1) 

iterator = 0 #(2) 
while players_list[iterator]['player_points'] == players_list[iterator + 1]['player_points']: 
    iterator += 1 

print(' >> The Winner Is...', end = ' ') 
if iterator == 0: 
    print(players_list[0]['player_name'].upper(), '!!!') #(3) 
elif iterator > 0: 
    print('There Is a Draw Between ', end = '') 
    for j in range (0, iterator + 1): 
     print(players_list[j]['player_name'], end = ', ') # (4)) 

    print() # (5) 

(1):這是在這種情況下,最好的方式來排序字典的值我的名單?

(2):這是我的想法來比較解決問題。您能否提出您的意見?如果需要,請提出更好的解決方案?

(3):在這種情況下,什麼樣的印刷方式是最「pythonic」?

print(players_list[0]['player_name'].upper(), '!!!') # 1  
print(%s!!! (players_list[0]['player_name'].upper())) # 2 
print({player_name}!!!.format(player_name = players_list[0] ['player_name']).upper()) # 3 

(4):如何在一行中不顯示','在一行顯示玩家列表? (5)我在一行顯示播放器後,使用空的print()來顯示'/ n'。有更好的解決方案嗎?

非常感謝

+0

這將更適合[代碼評論](http://codereview.stackexchange.com/) – Mel

+0

我打算這樣做時,我會準備好所有的代碼。這是我知道應該糾正的最後一個問題 – mathsicist

+0

空的'print()'?這不是一個問題,它是一個完全有效的代碼。我不確定你會找到更好的方式來打印空行。 – Mel

回答

1

當所有玩家都有相同數量的點時,您的代碼失敗。

在任何情況下,您都不需要也不希望對列表進行排序。你想掃描它,尋找具有最大點數的元素。

未經測試的代碼:

winners = None 
winner_points = None 
for p in players_list: 
    points = p['player_points'] 
    if winner_points is None or winner_points < points: 
     winners = [p] 
     winner_points = points 
    elif winner_points == points: 
     winners.append(p) 

if not winners: 
    print("Nobody played today!") 
elif len(winners) == 1: 
    print("The winner is", winners[0]['player_name']) 
else: 
    print("There is a draw between %d players: %s" % (len(winners), ", ".join(p['player_name'] for p in winners)) 

此外,編碼風格:

  • 不將數據存儲在一個哈希每個玩家。這就是對象的用途。
  • 不要命名字段player_XXXplayer['XXX']更具可讀性。使用對象,即player.XXX,更是如此。
+0

我沒有注意到我的代碼在那裏失敗。無論如何,我想創造一個新的名單,並把它放在勝利者的內部,但我不知道如何正確地做到這一點。我承認我沒有考慮過掃描列表,尋找點數最多的元素。非常感謝您的好解決方案。 – mathsicist

+0

也感謝您的建議。 – mathsicist