2017-08-12 12 views
0

私はいくつかの点を最小から最大まで並べ替えたいと思います。 私はこの結果取得したいでしょう:最小から最大まで並べ替え

Drogba 2 pts 
Owen 4 pts 
Henry 6 pts 

をしかし、私のランキングは、私は私の問題は、私の機能バブルソートであると思い

Henry 6 pts 
Owen 4 pts 
Drogba 2 pts 

:-(今は逆転しているようだ

?あなたのコードで
def Bubblesort(name, goal1, point): 
    swap = True 
    while swap: 
     swap = False 
     for i in range(len(name)-1): 
      if goal1[i+1] > goal1[i]: 
       goal1[i], goal1[i+1] = goal1[i+1], goal1[i] 
       name[i], name[i+1] = name[i+1], name[i] 
       point[i], point[i + 1] = point[i + 1], point[i] 
       swap = True 
    return name, goal1, point 

def ranking(name, point): 
    for i in range(len(name)): 
    print(name[i], "\t" , point[i], " \t ") 

name = ["Henry", "Owen", "Drogba"] 
point = [0]*3 
goal1 = [68, 52, 46] 
gain = [6,4,2] 


name, goal1, point = Bubblesort(name, goal1, point ) 
for i in range(len(name)): 
    point[i] += gain[i] 

ranking (name, point) 
+0

目標1 [I + 1]>目標1であれば[I]: - 常にアブドラAlemadi –

+0

@ :-(同じ問題作ります – tamzoro

答えて

0

  if goal1[i+1] > goal1[i]: 

これが大きいかどうかを確認します。次のものが小さい場合は交換し、大きい場合は交換する必要があります。

変更と:

  if goal1[i+1] < goal1[i]: 
+0

@ :-(同じ問題 - - オリバー・ニッケルを、それ常に '<' – tamzoro

+0

問題ありません!これが助けになったら、答えの隣にあるチェックマークを押して受け入れてください! –

0

問題の束:

  • def Bubblesort - PEP8はすなわちdef bubblesort

  • あなたのようにあなたのデータを格納している、関数名は小文字でなければなりませんと言いますパラレルリストの束。これにより、作業して考えること(とソート!)が難しくなります。あなたは名前のリスト、ポイントのリスト、名前、ポイント、ゴールを持つ選手のリストを持っているゴールのリストを持つ代わりに、データを転置する必要があります。

  • def bubblesort(name, goal1, point): - それは名前や目標とポイントを取得して(その方法は、他のものをソートするために、後で機能を再利用するからあなたを維持し、それを専門とする)目標にソートされていることを知っている必要はありませんdef bubblesort(items)bubblesortためのようになります。知っておくべきことは、アイテムのリストを取得しており、>を使用してアイテムのペアを比較できることです。すなわち、Item.__gt__が定義されています。

  • 代わりにデフォルトを使用しての「ネイティブ」ソート順、Pythonのソート機能は、通常、あなたが上でソートする何、それを伝えることを可能にするオプションkey機能を渡すことができます - つまり、ソートにkey(items[i]) > key(items[j])代わりitems[i] > items[j]の。これは、データを整理して、必要な並べ替え順序を得るよりも効率的かつ/または便利です。

  • for i in range(len(name)-1): - あなたは必要以上に反復しています。各パスの後、残りのリストの中で最も高い値が先頭にプッシュされます(したがって、「バブル」ソート、値はバブルのようにリストの先頭に上がります)。これらのトップ値は、残りのいずれの値よりも高いことを既に知っているので、再度参照する必要はありません。 n回目のパスの後に、最後のn個の値を無視することができます。

  • 実際、状況はそれより少し優れています。すでに並べ替えられた値のランを見つけることがあります。実際にスワップされた最高のインデックスを追跡している場合は、次のパスでそれを超える必要はありません。

だからあなたのソート機能は、あなたが、これは実際に正しいことを確認してください、それでは、それをテストしてみましょうしないことがあり

def bubblesort(items, *, key=None): 
    """ 
    Return items in sorted order 
    """ 
    # work on a copy of the list (don't destroy the original) 
    items = list(items) 
    # process key values - cache the result of key(item) 
    # so it doesn't have to be called repeatedly 
    keys = items if key is None else [key(item) for item in items] 
    # initialize the "last item to sort on the next pass" index 
    last_swap = len(items) - 1 
    # sort! 
    while last_swap: 
     ls = 0 
     for i in range(last_swap): 
      j = i + 1 
      if keys[i] > keys[j]: 
       # have to swap keys and items at the same time, 
       # because keys may be an alias for items 
       items[i], items[j], keys[i], keys[j] = items[j], items[i], keys[j], keys[i] 
       # made a swap - update the last_swap index 
       ls = i 
     last_swap = ls 
    return items 

次のようになります。

from random import sample 

def test_bubblesort(tries = 1000): 
    # example key function 
    key_fn = lambda item: (item[2], item[0], item[1]) 

    for i in range(tries): 
     # create some sample data to sort 
     data = [sample("abcdefghijk", 3) for j in range(10)] 
     # no-key sort 
     assert bubblesort(data) == sorted(data), "Error: bubblesort({}) gives {}".format(data, bubblesort(data)) 
     # keyed sort 
     assert bubblesort(data, key=key_fn) == sorted(data, key=key_fn), "Error: bubblesort({}, key) gives {}".format(data, bubblesort(data, key_fn)) 

test_bubblesort() 

今、あなたのコードの残りの部分は

なり、
class Player: 
    def __init__(self, name, points, goals, gains): 
     self.name = name 
     self.points = points 
     self.goals = goals 
     self.gains = gains 

players = [ 
    Player("Henry", 0, 68, 6), 
    Player("Owen", 0, 52, 4), 
    Player("Drogba", 0, 46, 2) 
] 

# sort by goals 
players = bubblesort(players, key = lambda player: player.goals) 

# update points 
for player in players: 
    player.points += player.gains 

# show the result 
for player in players: 
    print("{player.name:<10s} {player.points:>2d} pts".format(player=player)) 

Drogba  2 pts 
Owen  4 pts 
Henry  6 pts 
関連する問題