python - 在列表字典的每个索引处查找最小值和最大值
问题描述
我有一本具有以下结构的字典
{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'
您能否更正它或提出任何替代方法。
解决方案
您可以zip
使用min
和max
:
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
它自己的转置这一事实*
。
因此 usinglist(zip(*dct.values()))
为我们提供了我们想要的成对分组进行比较:
[(2, 1), (0, 2), (4, 3), (5, 4), (6, 5)]
推荐阅读
- vba - 在消息框中将数字转换为文本
- php - Predis ConnectionException:在 lumen api 5.6 上使用连接超时
- javascript - 排除数组中某些项目的逻辑
- mysql - 唯一但最新的行
- c# - 多个(长)真/假字符串的逻辑处理
- python - Python 3 使用 BeautifulSoup 抓取网页导致 UnicodeDecodeError
- java - Vertex.value() 属性 Not found Gremlin Neptune Java
- java - 在它们之间切换时避免刷新片段
- sql - SQL 语句与 LINQ to SQL 的输出排序结果不同
- python - SemEval-2013 任务 2 下载错误 - urllib.error.HTTPError:HTTP 错误 401:需要授权