Есть более эффективные способы сделать это, чем сортировать весь список и затем фильтровать, но, поскольку вы уже отсортировали весь список по ключу и, вероятно, поняли, как это работает, давайте начнем с этого:
a = [(3, (5, 4, False)), (3, (6, 4, False)), (2, (5, 1, False)), (1, (6, 2, False)), (-1, (6, 2, False))]
Итак, теперь вы хотите отфильтровать его только по тем, чей ключ совпадает с верхним:
b = [(key, value) for key, value in a if key == a[0][0]]
… за исключением того, что вы просто хотите value
, а не пару (key, value)
, что просто:
b = [value for key, value in a if key == a[0][0]]
Теперь, почему это неэффективно? Ну, если вы уже отсортировали список, вам не нужно проверять каждое значение ; Вы можете выйти из цикла, как только найдете тот, который не соответствует (например, с itertools.takewhile
). Но, проще говоря, вам не нужно сортировать в первую очередь; просто получите max
, а затем используйте его для фильтрации:
comb_list = list(zip(score_list, move_list))
comb_max = max(comb_list, key=lambda pair: pair[0])
b = [value for key, value in comb_list if key==comb_max[0]]
Или, что еще лучше, вам даже не нужно составлять промежуточный список, потому что max
не нуждается в zip
. Что также делает вещи намного проще для понимания:
max_score = max(score_list)
b = [move for score, move in zip(score_list, move_list) if score == max_score]