Задача:
Есть список из пар элементов:
compound_transpositions = [[2, 3], [3, 4], [4, 5], [5, 6]]
Есть коэффициенты линейной функции:
coefficients = [17, 69, 84, 3, 46, 97, 12, 68, 70, 10]
Нужно отсортировать compound_transpositions по возрастанию разности соответствующих коэффициентов линейной функции.
Сами разности получить удалось, вот например:
keys = map(lambda x: T.coefficients[x[0]]-T.coefficients[x[1]], p.compound_transpositions())
>>>[81, -43, -51, 85]
То есть первой паре [2, 3] соответствует разность второго и третьего коэффициента функции: 84-3=81. И так далее.
Вопрос: как теперь это объединить. Главное: задача проста и понятно как это сделать алгоритмически. Но интересует не просто решение, а красивое решение. В стиле питона, одной строчкой.
Тру мэдскиллз хакеры, подскажите пожалуйста. Заранее спасибо!
Спасибо! Все оказалось проще, видимо мне уже везде чудятся сложные конструкции. Только из-за того что compound_transpositions - это на самом деле результат вызова метода p.compound_transpositions() пришлось немного подправить вашу конструкцию. И получилось:
>>>p.compound_transpositions() = [[1, 2], [5, 6], [6, 7], [7, 8], [8, 9]]
>>>T.coefficients = [87, 57, 83, 99, 74, 18, 98, 11, 56, 26]
>>>sorted_tr = sorted(p.compound_transpositions(), key=lambda x: T.coefficients[x[0]]-T.coefficients[x[1]])
>>>print sorted_tr
[[5, 6], [7, 8], [1, 2], [8, 9], [6, 7]]
Tirael78: . Главное: задача проста и понятно как это сделать алгоритмически. Но интересует не просто решение, а красивое решение. В стиле питона, одной строчкой.
Спасибо всем за участие. Но все же замечания JRasor-а не кажутся немного несостоятельными.
В данном случае красота=простота. Я же не просила вундервафлю какую-то трудночитаемую написать в одну строчку.
Так как очевидно что сложность данной задачи О(n). То есть нужен грубо говоря один for. В питоне один for замечательно заменяется ему-подобными конструкциями и занимают они как раз одну строчку.
Весь трюк заключался в том чтобы правильно прописать ключ сортировки, что у меня не получалось.
А так я всеми руками за понятный и читаемый код.
Но в любом случае спасибо JRasor за напоминание - как нужно писать код. Перечитать, и в рамочку)