Сортировка списка списка с пользовательской функцией сравнения в Python

Я знаю, что есть несколько вопросов, названных так, но я не могу получить ответы на них.

У меня есть список списков, 50 раз 5 элементов. Теперь я хочу отсортировать этот список, применив специальную функцию сравнения к каждому элементу. Эта функция вычисляет соответствие списка, по которому элементы сортируются. Я создал две функции, сравнение и пригодность:

def compare(item1, item2): return (fitness(item1) < fitness(item2)) 

а также

 def fitness(item): return item[0]+item[1]+item[2]+item[3]+item[4] 

Затем я попытался позвонить им:

 sorted(mylist, cmp=compare) 

или

 sorted(mylist, key=fitness) 

или

 sorted(mylist, cmp=compare, key=fitness) 

или

 sorted(mylist, cmp=lambda x,y: compare(x,y)) 

Также я попробовал list.sort () с теми же параметрами. Но в любом случае функции не получают список в качестве аргумента, а None . Я понятия не имею, почему это происходит, в основном из C ++, это противоречит любой идее функции обратного вызова для меня. Как я могу сортировать эти списки с помощью специальной функции?

Редактировать Я нашел свою ошибку. В цепочке, которая создает исходный список, одна функция не возвращала ничего, кроме возвращаемого значения. Извините за беспокойство

3 Solutions collect form web for “Сортировка списка списка с пользовательской функцией сравнения в Python”

 >>> l = [list(range(i, i+4)) for i in range(10,1,-1)] >>> l [[10, 11, 12, 13], [9, 10, 11, 12], [8, 9, 10, 11], [7, 8, 9, 10], [6, 7, 8, 9], [5, 6, 7, 8], [4, 5, 6, 7], [3, 4, 5, 6], [2, 3, 4, 5]] >>> sorted(l, key=sum) [[2, 3, 4, 5], [3, 4, 5, 6], [4, 5, 6, 7], [5, 6, 7, 8], [6, 7, 8, 9], [7, 8, 9, 10], [8, 9, 10, 11], [9, 10, 11, 12], [10, 11, 12, 13]] 

Вышеупомянутые работы. Вы делаете что-то другое?

Обратите внимание, что ваша ключевая функция является просто sum ; нет необходимости писать это явно.

Кроме того, ваша функция сравнения неверна. Он должен возвращать -1, 0 или 1, а не логический, как у вас есть. Правильной функцией сравнения будет:

 def compare(item1, item2): if fitness(item1) < fitness(item2): return -1 elif fitness(item1) > fitness(item2): return 1 else: return 0 

Вам нужно немного изменить функцию compare и использовать functools.cmp_to_key чтобы передать ее для sorted . Пример кода:

 import functools lst = [list(range(i, i+5)) for i in range(5, 1, -1)] def fitness(item): return item[0]+item[1]+item[2]+item[3]+item[4] def compare(item1, item2): return fitness(item1) - fitness(item2) sorted(lst, key=functools.cmp_to_key(compare)) 

Вывод:

 [[2, 3, 4, 5, 6], [3, 4, 5, 6, 7], [4, 5, 6, 7, 8], [5, 6, 7, 8, 9]] 

Работает 🙂

  • Возвращаемая строка соответствует двум спискам для заданного количества элементов в третьем списке
  • Как сделать полностью нераскрытую копию сложного списка? (Глубокой копии недостаточно)
  • Список поплавков в Python заканчивается символом ':' при преобразовании в строку
  • В чем разница между списком и списком ?
  • Как передать элементы кортежей функции в качестве аргументов в python?
  • Список в словаре, цикл в Python
  • Вложенные списки и списки
  • Что такое dict_keys, dict_items и dict_values
  • Создавать список только в python с каждым 5-м элементом?
  • Как добавить к списку в словаре?
  • Разделение списка на отдельные части длины в специальном состоянии
  •  
    Interesting Posts for Van-Lav

    Распознавать изображения в Python

    mpi4py: закрыть MPI Spawn?

    async wait / non blocking wait в python

    Более эффективный способ очистки столбца строк и добавления нового столбца

    Сайт Twitter Bootstrap, развернутый с помощью GAE

    Как назначить bz2 для altinstall python?

    Каков самый короткий способ подсчета количества элементов в генераторе / итераторе?

    Как читать данные cx_Oracle.LOB в Python?

    Как узнать, запущена ли программа из командной строки или из Интернета?

    В Pandas, что означает эквивалент «nrows» от read_csv (), который будет использоваться в read_excel ()?

    NameError: имя 'N_TOKENS' не определено

    Переопределение кнопки кнопки Tkinter «X» (кнопка, закрывающая окно)

    Переменные Python теряют объем внутри генератора?

    Эмпирическая сложность реализации «сортировки библиотеки», похоже, не похожа на O (n log n)

    Как проверить необоснованное значение с помощью add_xpath в scrapy и установить значение элемента в значение по умолчанию?

    Python - лучший язык программирования в мире.