簡體   English   中英

在列表字典的每個索引處查找最小值和最大值

[英]Find minimum and maximum value at each index of a dictionary of lists

我有一個字典有以下結構

{key1: [1,2,3,4,5], key2: [2,0,4,5,6]}

我需要找到值列表的每個索引的最大值和最小值,因此在索引0處,我們比較1 and 2並選擇2作為最大值, 1作為最小值,等等。

我的例子的預期輸出:

min = [1,0,3,4,5]
max = [2,2,4,5,6]

我不能使用運算符,因為我不允許導入它。 我嘗試使用以下方法但失敗(語法錯誤)。 此外,我不會迭代值集,因為不是優雅的方式(IMO)。

maxVal = max(myDictionary.items(), key=(lambda k: myDictionary[k]))

給我

TypeError: unhashable type: 'list'

你能糾正它還是建議任何替代方法。

您可以使用minmax zip

dct = {'key1': [1,2,3,4,5], 'key2': [2,0,4,5,6]}

[min(i) for i in zip(*dct.values())]
[max(i) for i in zip(*dct.values())]

輸出:

[1, 0, 3, 4, 5]
[2, 2, 4, 5, 6]

如果你想變得非常花哨,你也可以使用兩次轉換技巧zip將它變成一個單行:

min_list, max_list = map(list, zip(*[(min(i), max(i)) for i in zip(*dct.values())]))

min_list
[1, 0, 3, 4, 5]

max_list
[2, 2, 4, 5, 6]

這種奇特的方法在空列表中表現不佳

例如:

dct = {1: [], 2: []}

會打破這種方法。 事實上,幾乎所有打破這種方法的方法都涉及在某處使用空列表。


我已經兩次提到了zip轉換技巧,所以這就是為什么這里有必要:

如果您只使用list(zip(dct.values())) ,您將獲得以下輸出:

[([2, 0, 4, 5, 6],), ([1, 2, 3, 4, 5],)]

這不是理想的結果,我們希望對子列表的每個索引處的每個元素進行成對比較。 但是,當您使用*運算符時,我們可以利用zip是它自己的轉置的事實。

因此,使用list(zip(*dct.values()))為我們提供了所需的成對分組以進行比較:

[(2, 1), (0, 2), (4, 3), (5, 4), (6, 5)]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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