如何通过使用lambda或函数从列表中获取比较值来获取列表中的最小值/最大值?

Rem*_*ius 3 python collections lambda max python-2.7

在Python中,我想使用lambda在列表中找到max元素进行比较.

这段代码没有成功:

# An 'anonymous' object, like JSON object. Use like: Mock(name='Bob', age=30)
class Mock(object):
    def __init__(self, **kwargs):
        self.__dict__.update(kwargs)

items = [
    Mock(cost=10, quantity=1),
    Mock(cost=15, quantity=3),
    Mock(cost=20, quantity=5),
    Mock(cost=100, quantity=2)
]

index, value = max(items, key=lambda(item) : item.cost * item.quantity)
print('$%d, q=%d' % (value.cost, value.quantity))
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

    index, value = max(items, key=lambda(item) : item.cost * item.quantity)
TypeError: 'Mock' object is not iterable
Run Code Online (Sandbox Code Playgroud)

我该如何正确实现?

Cor*_*man 7

如果您不需要索引,可以直接使用结果:

value = max(items, key=lambda(item) : item.cost * item.quantity)
print value.cost, value.quantity
Run Code Online (Sandbox Code Playgroud)

max返回实际的最大项目,这是一个Mock实例.您无法将其解压缩为两个项目.

如果你真的想要索引,你可以找到它,或者稍微修改你的搜索以将索引装饰到项目中:

index, value = max(enumerate(items), key=lambda(item): item[1].cost * item[1].quantity)
Run Code Online (Sandbox Code Playgroud)

首先,我们将原始列表转换为第二个列表,其中每个项目都是(索引,值)的元组.然后,键也必须改变,因为而不是item.cost,item现在是(index, MockItem)一对,所以你需要得到item[1],然后获取属性.不要忘记将结果解压缩到索引和值以获得两者.


Kob*_*ohn 2

这不是最有效的方法,但对于任何阅读它的人来说都很容易理解。如果您的列表非常大,请告诉我,我会为您指出更有效的解决方案。

# get the value
max_item = max(items, key=lambda item: item.cost * item.quantity)
# get the index
max_item_index = items.index(max_item)
Run Code Online (Sandbox Code Playgroud)

如果您还想要计算值,那么只需执行一个循环即可使其清晰:

max_value = max_index = max_item = None
for i, item in enumerate(items):
    value = item.cost * item.quantity
    if (max_value is None) or (value > max_value):
        max_value = value
        max_index = i
        max_item = item

if max_value is not None:
    print max_index, max_value, max_item        
Run Code Online (Sandbox Code Playgroud)