簡體   English   中英

獲取字典中列表列表中每個鍵的最大值列表

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM