Получить список максимальных значений для ключа в списке списка внутри словаря - PullRequest
0 голосов
/ 01 мая 2018

Мне нужен список максимальных значений для каждого ключа. В следующем примере:

mydict = {
"day1": [[9],[2],[3]], 
"day2": [[4],[5],[6]],
"day3": [[3],[2],[1]]
}

мне нужно что-то вроде result=[9,6,3]

Я пытался:

result = max(map(max, i) for i in worksheet.values())

но он просто возвращает мне первое значение ключа. Как всегда, большое спасибо заранее.

Ответы [ 5 ]

0 голосов
/ 01 мая 2018

Вы можете создать новый dict с максимальными значениями для каждого списка списков и использовать список Алекса Мартелли шаблон сплющивания :

>>> {k:max(e for sl in l for e in sl) for k,l in mydict.items()} 
{'day2': 6, 'day3': 3, 'day1': 9}

Тот же общий метод, вы можете создать список максимальных значений:

>>> [max(e for sl in l for e in sl) for l in mydict.values()] 
[6, 3, 9]

(ИМХО имеет ограниченную ценность, так как в Python неупорядоченные в Python версии до 3.6)

Конечно, при желании это можно отсортировать:

>>> sorted([max(e for sl in l for e in sl) for l in mydict.values()], reverse=True) 
[9, 6, 3]

(Но тогда какой ключ имеет какой максимум? Из вашего вопроса неясно, имеет ли это значение ...)

0 голосов
/ 01 мая 2018

Проблема, с которой вы столкнулись, заключается в том, что внутренние элементы также являются списками, поэтому вы должны их распаковать. Мое первое предположение состояло бы в том, что структура mydict неверна, если каждый из этих внутренних списков должен иметь длину только один элемент. Возможно, это выглядит так:

mydict = {
    "day1": [9, 2, 3], 
    "day2": [4, 5, 6],
    "day3": [3, 2, 1]
}

Кроме того, вам нужно сгладить внутренние списки. Я мог бы сделать что-то вроде:

[max(sum(lists, [])) for lists in mydict.values()]

Обратите внимание, что эта версия зависит от упорядоченного словаря (что справедливо для достаточно недавних версий python, но определенно не для всех версий.

0 голосов
/ 01 мая 2018

Вы можете использовать itertools.chain.from_iterable, чтобы избавиться от одного слоя вложенности:

>>> from itertools import chain
>>> 
>>> mydict = {
... "day1": [[9],[2],[3]], 
... "day2": [[4],[5],[6]],
... "day3": [[3],[2],[1]]
... }
>>> 
>>> list(map(max, map(chain.from_iterable, mydict.values())))
[9, 6, 3]
0 голосов
/ 01 мая 2018

Вы можете сделать это с помощью этого понимания вложенного списка:

result = [max([i for sublist in mydict[k] for i in sublist]) for k in mydict]

>>> result
[9, 6, 3]

Пояснение:

Понимание внутреннего списка:

[i for sublist in mydict[k] for i in sublist]

Сглаживает каждый список (каждый список значений в вашем словаре). Затем вы берете max() для каждого из них, когда вы перебираете for k in my dict

0 голосов
/ 01 мая 2018

Хотя вы можете использовать простую индексацию, решение, использующее последнее, не будет масштабироваться для ввода с произвольной глубиной. Вместо этого используйте рекурсию с max:

flattened = lambda x:[c for h in [[i] if not isinstance(i, list) else flattened(i) for i in x] for c in h]
mydict = {'day2': [[4], [5], [6]], 'day3': [[3], [2], [1]], 'day1': [[9], [2], [3]]}
result = {a:max(flattened(b)) for a, b in mydict.items()}

Выход:

{'day2': 6, 'day3': 3, 'day1': 9}

С глубиной данных n-уровней:

data = {3:[4, 5, 2, [4, [53, [4, 200]]]], 4:[[[56, 3], [4, [[5]]]]]}
new_result = [max(flattened(i)) for i in data.values()]

Выход:

[200, 56]
...