Nano Hash - криптовалюты, майнинг, программирование

Заказ списка словарей на Python

У меня есть список словарей на Python:

mylist = [
{'id':0, 'weight':10, 'factor':1, 'meta':'ABC'},
{'id':1, 'weight':5, 'factor':1, 'meta':'ABC'},
{'id':2, 'weight':5, 'factor':2, 'meta':'ABC'},
{'id':3, 'weight':1, 'factor':1, 'meta':'ABC'}
]

Какой самый эффективный / самый чистый способ упорядочить этот список по весу, а затем по коэффициенту (численно). В результате список должен выглядеть так:

mylist = [
{'id':3, 'weight':1, 'factor':1, 'meta':'ABC'},
{'id':1, 'weight':5, 'factor':1, 'meta':'ABC'},
{'id':2, 'weight':5, 'factor':2, 'meta':'ABC'},
{'id':0, 'weight':10, 'factor':1, 'meta':'ABC'},
]
14.05.2009

Ответы:


1

Что-то вроде следующего должно работать:

def cmp_dict(x, y):
    weight_diff = y['weight'] - x['weight']
    if weight_diff == 0:
        return y['factor'] - x['factor']
    else:
        return weight_diff

myList.sort(cmp_dict)
14.05.2009

2

Я принял ответ dF для вдохновения, но вот что я в конечном итоге выбрал для своего сценария:

@staticmethod
def ordered_list(mylist):
    def sort_func(d):
        return (d['weight'], d['factor'])

    mylist.sort(key=sort_func)
14.05.2009
  • 'operator.itemgetter (' weight ',' factor ')' - это питонический способ выразить вашу 'sort_func'. 14.05.2009

  • 3
  • Я бы хотел поставить +1 к этому, потому что он использует ключ. Я ничего не могу +1 с лямбдой. Версия def обычно проще для n00bz, чем лямбда. 14.05.2009
  • То, что n00b не может понять лямбду, не означает, что ее не следует использовать. Фактически, лямбда-выражения упрощают выполнение кода и допускают некоторую магию / сахар, невозможную другими способами. Если вы не понимаете лямбды, вам следует поискать такие вопросы, как этот stackoverflow.com/questions/150129/ what-is-a-lambda или www.diveintopython.org/power_of_introspection/lambda_functions.html и возвращайтесь, когда поймете их. Кроме того, stackoverflow.com/questions/134626/ не указывает, когда следует использовать лямбда-выражения. 14.05.2009
  • Это не вопрос понимания или страха. Я устаю от n00b вопросов. Простой def делает то же самое, но, как правило, его легче понять и понять. Спустя 30 лет я узнал, что все программное обеспечение поддерживается и улучшается n00bz, которые не понимают нюансов. 14.05.2009
  • Если не показывать лямбду людям, которые не выучили лямбду, это гарантирует, что они никогда ее не выучат. 14.05.2009
  • +1 потому что он показал мне operator.itemgetter () (и я не боюсь лямбды, кстати) 17.01.2013

  • 4
  • Это не работает (вы имели в виду предмет ["вес"]?). Кроме того, когда он исправлен, он работает в cPython из-за небольшой удачи, но не должен работать в других реализациях Python. В кортеже должно быть 3 элемента. Также Вы переписываете список, когда Вам это не нужно, смотрите принятый ответ. 15.05.2009
  • Вы имели в виду предмет ["вес"]? Да, я сделал; когда я использовал фрагмент, я получил ключ от переменной, отсюда и ошибка. кстати, он работает в py2.4.4, 2.5.1, 2.5.2. 15.05.2009
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..