如何在 Python 中对字典使用 reduce

Posted

技术标签:

【中文标题】如何在 Python 中对字典使用 reduce【英文标题】:How to use reduce on dictionary in Python 【发布时间】:2021-02-27 03:01:19 【问题描述】:

我有两个类 - Item 和 AIShoppingCart(其中有字典,例如 "milk" : Item(2, 2.28, 1))。我必须使用 reduce 从我的购物车中找到最喜欢的商品,并且我不能使用 max()。不幸的是,我的程序抛出了一个错误

() 接受 1 个位置参数,但给出了 2 个


class Item:
def __init__(self,quantity,price,likable):
    self.quantity = quantity
    self.price = price
    self.likable = likable

class AIShoppingCart(ShoppingCart):
def __init__(self,items):
    super().__init__(items)
def add_item(self,name,quantity,price):
    if name in self.items:
        self.items[name].likable+=1
        self.items[name].quantity+=quantity
    else:
        items[name]=Item(quantity,price,1)

def findMostLikable(self):
    return reduce(lambda x:self.items[x].likable>1, self.items)

我应该如何使用reduce?

【问题讨论】:

【参考方案1】:

请查阅reduce 的文档。如果你这样做 reduce(f, [a, b, c, d]) 这将基本上应用为 f(f(f(a, b), c), d) - 所以 reduce 基本上一次需要 2 个元素并将它们减少到 1。

在您的情况下,reduce 函数只需按值选择较大的元素:

return reduce(lambda a, b: a if a[1].likable >= b[1].likable else b,
              self.items.items())

.items() 函数将字典的键值对作为元组列表获取,我使用 a[1]/b[1] 获得其值——返回的结果是键值元组。

如果你只想要最大值,而不关心按键:

return reduce(lambda a, b: a if a.likable >= b.likable else b,
              self.items.values()).likable

【讨论】:

我明白了,但我无法解决如何通过喜欢的属性来比较项目。 那是a[1].likable,我会更新我的答案,对此感到抱歉 我收到以下错误('eggs', )但是是的,它几乎可以工作。输出应该是鸡蛋的可爱计数。 这不是错误,这就是结果。您可以将[1].likable 添加到最后以获取值,但在这种情况下,您可以直接迭代.values()。我会更新我的答案。

以上是关于如何在 Python 中对字典使用 reduce的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Python 中对字典列表进行多重排序? [复制]

如何在 Python 中对存储在字典中的 IP 地址进行排序?

如何在 Python 中对大量字典进行排序而不加载到内存中

在Python列表中对嵌套字典进行排序? [复制]

如何正确使用reduce和字典

python中对文件的处理