获取包含多个字典的列表中最大值对应的索引

15

我正在尝试获取以下字典列表中,具有最大'size'的字典的索引:

ld = [{'prop': 'foo', 'size': 100}, {'prop': 'boo', 'size': 200}]

使用以下代码可以获取最大尺寸:

items = [x['size'] for x in ld]
print(max(items))

现在我该如何获取它的索引?有简单的方法吗?

测试:

我刚刚发现我可以这样做:

items = [x['size'] for x in ld]
max_val = max(items)
print(items.index(max_val))

这是否正确?

2个回答

27

告诉max()如何计算一系列索引的最大值:

max(range(len(ld)), key=lambda index: ld[index]['size'])

这将返回size键值最高的索引:

>>> ld = [{'prop': 'foo', 'size': 100}, {'prop': 'boo', 'size': 200}]
>>> max(range(len(ld)), key=lambda index: ld[index]['size'])
1
>>> ld[1]
{'size': 200, 'prop': 'boo'}

如果你一直想要那个字典,那么你可以使用:

max(ld, key=lambda d: d['size'])

你可以使用 enumerate() 获取索引 字典:

max(enumerate(ld), key=lambda item: item[1]['size'])

更多演示:

>>> max(ld, key=lambda d: d['size'])
{'size': 200, 'prop': 'boo'}
>>> max(enumerate(ld), key=lambda item: item[1]['size'])
(1, {'size': 200, 'prop': 'boo'})

key函数依次接收输入序列中的每个元素,max()函数会选择该key函数返回值最高的元素。

使用单独的列表提取所有size值,然后将其映射回原始列表并不是很有效(现在需要对列表进行两次迭代)。list.index()无法工作,因为它必须匹配整个字典,而不仅仅是其中一个值。


太棒了!正是我在寻找的东西:“max(range(len(ld)), key=lambda index: ld[index]['size'])”。现在我只需要弄清楚它是如何工作的 :) 我仍然处于学习的起步阶段。 - SadSack963
如果你想使用字典 "max(ld, key=lambda d: d['size'])",我们如何确保 "size" 在 d 中存在? - Kulu
1
@Kulu 如果一个键不存在,你可以使用 d.get("size", float("-inf"));这将使用负无穷作为默认值,以确保这些条目被视为具有小于任何最小值的值。或者,先过滤掉那些条目。 - Martijn Pieters

5
您可以使用适当的键将enumerate(ld)传递给max函数:
>>> max(enumerate(ld),key=lambda arg:arg[1]['size'])[0]
1

如果您只需要具有最大size值的字典,作为Pythonic方法,您可以使用operator.itemgetter函数作为键:

In [10]: from operator import itemgetter 

In [11]: ld = [{'prop': 'foo', 'size': 100}, {'prop': 'boo', 'size': 200}]

In [12]: fn = itemgetter('size')

In [13]: max(ld, key=fn)
Out[13]: {'prop': 'boo', 'size': 200}

在Python 3.7中遇到“SyntaxError: invalid syntax”错误。只能使用lambda表达式才能使max(enumerate(ld), key=lambda k : k[1]['size'])[0]正常工作。 - Josmoor98

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接