[英]Get a list of max values per key in a list of list inside a dictionary
我需要每個鍵的最大值列表。 在以下示例中:
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}
隨着數據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]
您可以使用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]
您可以使用以下嵌套列表理解來做到這一點:
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]
展平每個列表(字典值中列表的每個列表)。 然后,當您遍歷for k in my dict
時,可以對每個參數使用max()
您可以使用Alex Martelli的列表展平模式 ,使用列表的每個列表的最大值創建一個新的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 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]
(但是然后哪個鍵具有哪個最大值?從您的問題尚不清楚這是否重要...)
您遇到的問題是內部元素也是列表,因此您必須解壓縮它們。 我的第一個建議是,如果假設每個內部列表都只有一個元素長,則mydict
的結構是錯誤的。 可能看起來像這樣:
mydict = {
"day1": [9, 2, 3],
"day2": [4, 5, 6],
"day3": [3, 2, 1]
}
或者,您需要展平內部列表。 我可能會做類似的事情:
[max(sum(lists, [])) for lists in mydict.values()]
請注意,此版本取決於所訂購的字典(對於最近使用的足夠多的python版本,這是正確的,但絕對不是所有版本。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.