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)
我该如何正确实现?
如果您不需要索引,可以直接使用结果:
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]
,然后获取属性.不要忘记将结果解压缩到索引和值以获得两者.
这不是最有效的方法,但对于任何阅读它的人来说都很容易理解。如果您的列表非常大,请告诉我,我会为您指出更有效的解决方案。
# 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)
归档时间: |
|
查看次数: |
6523 次 |
最近记录: |