Поиск и печать максимального значения из словарей в списке [дубликат]

ECMAScript 6 имеет «генераторы», которые позволяют вам легко программировать в асинхронном стиле.

function* myGenerator() {
    const callback = yield;
    let [response] = yield $.ajax("https://stackoverflow.com", {complete: callback});
    console.log("response is:", response);

    // examples of other things you can do
    yield setTimeout(callback, 1000);
    console.log("it delayed for 1000ms");
    while (response.statusText === "error") {
        [response] = yield* anotherGenerator();
    }
}

Для запуска вышеуказанного кода вы делаете это:

const gen = myGenerator(); // Create generator
gen.next(); // Start it
gen.next((...args) => gen.next([...args])); // Set its callback function

Если вам нужно настроить таргетинг на браузеры, которые не поддерживают ES6, вы можете запустить код через Babel или short-compiler для генерации ECMAScript 5.

Обратный вызов ...args завернут в массив и разрушен, когда вы их читаете так что шаблон может справиться с обратными вызовами, которые имеют несколько аргументов. Например, с узлом fs :

const [err, data] = yield fs.readFile(filePath, "utf-8", callback);

8
задан Kvash 30 May 2015 в 13:47
поделиться

2 ответа

Скажите max(), как вычислить максимум для последовательности индексов:

max(xrange(len(ld)), key=lambda index: ld[index]['size'])

Это вернет индекс, для которого клавиша size самая высокая:

>>> ld = [{'prop': 'foo', 'size': 100}, {'prop': 'boo', 'size': 200}]
>>> max(xrange(len(ld)), key=lambda index: ld[index]['size'])
1
>>> ld[1]
{'size': 200, 'prop': 'boo'}

Если вам нужен этот словарь, то вы можете просто использовать:

max(ld, key=lambda d: d['size'])

и получить как словарь , так и словарь, вы можете использовать enumerate() здесь:

max(enumerate(ld), key=lambda item: item[1]['size'])

Еще одна демонстрация:

>>> max(ld, key=lambda d: d['size'])
{'size': 200, 'prop': 'boo'}
>>> max(enumerate(ld), key=lambda item: item[1]['size'])
(1, {'size': 200, 'prop': 'boo'})

Функция key передается каждому элементу во входной последовательности по очереди, а max() выбирает элемент, в котором значение возврата для этой функции key является самым высоким.

Используя отдельный список для извлечения всех значений size, отображение, возвращаемое в исходный список, не очень эффективно (теперь вам нужно дважды перебирать список). list.index() не может работать, поскольку он должен соответствовать всему словарю, а не только одному значению в нем.

14
ответ дан Martijn Pieters 24 August 2018 в 04:06
поделиться

Вы можете передать функцию enumerate(ld) в max с помощью правильной клавиши:

>>> max(enumerate(ld),key=lambda (x,y):y['size'])[0]
1
3
ответ дан Kasramvd 24 August 2018 в 04:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: