2013-10-15 4 views
0

Допустим, у меня есть список игроковPython Сортировка списков по значению

listOfPlayers = [ 
       ("Player1","PG",Cost,projectedPoints), 
       ("Player2","PG",Cost,projectedPoints), 
       ("Player3","SG",Cost,projectedPoints), 
       ("Player4","SG",Cost,projectedPoints), 
       ("Player5","SF",Cost,projectedPoints), 
       ("Player6","SF",Cost,projectedPoints), 
       ("Player7","PF",Cost,projectedPoints), 
       ("Player8","PF",Cost,projectedPoints), 
       ("Player9","C",Cost,projectedPoints), 
       ("Player10","C",Cost,projectedPoints) 
       ] 

Тогда пустой список

selectedList = [] 

мне нужно перебирать игроков, позиции и вытащить самую лучшую цену/проецируемых точек в выбранный список, но уловка у меня может быть только 1 из каждой позиции, например (pg, sg, sf, pf, c). Как мне это сделать?

ответ

0

Сначала сортировать по цене/проецируются соотношение пунктов:

listOfPlayers.sort(key=lambda (name, pos, cost, pts): float(cost)/pts, reverse=True) 

Затем цикл по списку и вытащить их из:

results = {} 
for name, pos, cost, pts in listOfPlayers: 
    if pos in results: 
     #position already filled 
     continue 
    results[pos] = (name, pos, cost, pts) 

Вы можете остановить раньше, в зависимости от того, знаете ли вы, что позиции вам нужно заранее, например:

needed_positions = set(["PG", "SG", "SF", "C"]) 
results = {} 
for name, pos, cost, pts in listOfPlayers: 
    if not needed_positions: 
     #all spots filled 
     break 
    if pos in results: 
     #this position already filled 
     continue 
    results[pos] = (name, pos, cost, pts) 
    needed_positions.remove(pos) 
0
players.sort(operator.itemgetter(1)) # sort by position 
for pos, players in itertools.groupby(players, key=operator.itemgetter(1)): 
    best = max(players, key=lambda p:float(p[2])/p[3]) 
    print "The best player for position %s is %s" %(best[1], best[0]) 
0
import itertools 

players = [ 
    # name   position cost projected_points 
    ("Player1",  "PG",  1,  13), 
    ("Player2",  "PG",  2,  54), 
    ("Player3",  "SG",  4,  44), 
    ("Player4",  "SG",  8,  34), 
    ("Player5",  "SF",  3,  14), 
    ("Player6",  "SF",  2,  91), 
    ("Player7",  "PF",  10,  20), 
    ("Player8",  "PF",  4,  32), 
    ("Player9",  "C",  9,  12), 
    ("Player10", "C",  3,  82) 
] 

def cost(p): 
    return float(p[3])/p[2] 

players.sort(reverse=True, key=lambda x: (x[1], cost(x))) 

for k, g in itertools.groupby(players, lambda x: x[1]): 
    best = list(g)[0] 
    print(best) 
0

Если вы заинтересованы в этом с объектом PandasDataFrame, этот код будет работать. Это полезно, если вам нужно часто выполнять такие виды сортировки/агрегации или более крупные данные, а также использовать эффективные операции массива NumPy для быстрого выполнения вычислений.

df = pandas.DataFrame(listOfPlayers, 
         columns=["Player", "Pos", "Cost", "ProjectedPoints"]) 

df['Ratio'] = df.Cost/df.ProjectedPoints 
best_players = df.groupby("Pos").apply(lambda x: x.Player.values[x.Ratio.argmax()]) 
Смежные вопросы