Python 获取字典内列表中每个键的最大值列表

Python 获取字典内列表中每个键的最大值列表,python,list,dictionary,nested-lists,Python,List,Dictionary,Nested Lists,我需要每个键的最大值列表。在以下示例中: 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()) 但它只返回第一个键值。一如既往,非常感谢您。虽然您可以使用简单的索引,但使用后者的解决方案不会对任意深度的输入进行缩放。相反,

我需要每个键的最大值列表。在以下示例中:

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())

但它只返回第一个键值。一如既往,非常感谢您。

虽然您可以使用简单的索引,但使用后者的解决方案不会对任意深度的输入进行缩放。相反,将递归与
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}
[200, 56]
数据深度为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()]
输出:

{'day2': 6, 'day3': 3, 'day1': 9}
[200, 56]

您可以使用
itertools.chain.from\u 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]

您可以使用此嵌套列表执行此操作:

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]
说明:

内部列表理解:

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]

展平每个列表(字典中的每个列表值)。然后,当您在my dict中迭代k的

问题是内部元素也是列表,因此您必须将它们解压缩。我的第一个建议是,如果这些内部列表中的每一个都被认为只有一个元素长,那么
mydict
的结构是错误的。可能是这样的:

mydict = {
    "day1": [9, 2, 3], 
    "day2": [4, 5, 6],
    "day3": [3, 2, 1]
}
或者,您需要展平内部列表。我可能会这样做:

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

请注意,此版本取决于所订购的词典(对于最近足够多的python版本来说,这是正确的,但绝对不是所有版本。

您可以创建一个新的dict,其中包含每个列表的最大值,并使用list:

使用相同的常规技术,您可以创建最大值列表:

>>> [max(e for sl in l for e in sl) for l in mydict.values()] 
[6, 3, 9]
(由于Python Dict在3.6之前的Python中是无序的,因此它的值是有限的)

当然,如果需要,可以对其进行排序:

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

(但是哪个钥匙有哪个max?你的问题不清楚这是否重要……)

永远不要使用。非常感谢你们,朱利安!你们太棒了!不幸的是,我需要一个列表,有时其中一些会包含多个值,我只是在示例中使用了每个列表的一个值来保持简单。再次非常感谢你们的时间和奉献精神。谢谢@Ajax1234!有没有办法设置排序结果?我的意思是,获取
[9,6,3]
,而不是
[6,3,9]
(根据键的排序顺序…)。我尝试了:
[max(展平(I))表示排序后的I(工作表.values())]
但似乎不起作用。@Victor字典是未排序的,因此,
dict.values
的顺序不能保证。但是,您可以使用
dict.items
并使用字典理解来更好地保留整体结构。请参阅我最近的编辑。@Victor来自Python 3.7字典,将保证顺序正确。我不是%100当然,但我认为该功能已经在3.6版中出现了,只是还没有正式发布。非常感谢,@dawg…我不知道字典没有排序,但我会记住你的答案,关于如何创建一个只包含最大值的新dict,这对我将来的应用程序很有用。再次,非常感谢!