当前位置: 首页 > 面试题库 >

Python defaultdict和lambda

孙渝
2023-03-14
问题内容

在其他人的代码中,我阅读了以下两行:

x = defaultdict(lambda: 0)
y = defaultdict(lambda: defaultdict(lambda: 0))

由于defaultdict的参数是默认工厂,因此我认为第一行表示当我为不存在的键k调用x [k](例如类似v = x [k]的语句)时,键值对(k
,0)会自动添加到字典中,就像首先执行语句x [k] = 0一样。我对么?

那y呢?似乎默认工厂将创建一个默认值为0的defaultdict。但这具体意味着什么?我试图在Python
shell中尝试使用它,但无法弄清楚它到底是什么。


问题答案:

我认为第一行意味着当我要求x[k]一个不存在的键k(例如类似的语句v=x[k])时,键值对(k,0)将被自动添加到字典中,就像该语句x[k]=0首先执行一样。

那就对了。这是习惯用语

x = defaultdict(int)

对于y,当您执行时y["ham"]["spam"],如果密钥不存在"ham"y则将其插入。与之关联的值将变成一个defaultdict,其中"spam"将自动插入一个带有的值0

即,y是一种“两层” defaultdict。如果为"ham" not in y,则评估y["ham"]["spam"]就像在做

y["ham"] = {}
y["ham"]["spam"] = 0

就普通而言dict



 类似资料:
  • 我的理解是lambda的表达式被用来替换抽象实现的boiler-plater代码。因此,如果我必须创建一个接受可运行接口(函数式)的新线程,我不必创建一个新的匿名类,然后提供void run()并在其中编写逻辑,而是可以简单地使用lambda并将其指向一个方法,前提是方法签名与run相同,即不接受任何内容,也不返回任何内容。 但是我不能理解下面的实现 在上面的例子中,printStudent使用了

  • 是否可以对流进行求和、平均并将其转换为新对象。我有个目标 现在我想得到这个对象列表的平均值和总和(代码总和价格和代码平均价格) 然后我想创建一个新对象(页脚 这就是我现在所拥有的,它可以工作,但是我要通过两次流。我想要一个方法,我可以通过一次流来做到这一点。 有没有更好的方法做到这一点而不必重复这一点。谢谢

  • 问题内容: 我听说lambda即将传到您附近的Java(J8)。我在某个博客上找到了一个示例,说明了它们的外观: 所以马上开始: 在哪里和类型?还是不是(像某种奇怪的泛型形式)? Lambda是 一种 封闭 类型 ,还是相反? 与典型的匿名功能相比,这将给我带来什么好处? 问题答案: Lambda表达式只是用于实现目标接口的语法糖,这意味着您将通过lambda表达式在接口中实现特定方法。编译器可以

  • 问题内容: 我想知道是否有人可以向我解释以下怪异现象。我正在使用Java 8 Update 11。 给定这种方法 如果我首先构造一个函数Object,并将其传递给上面的方法,那么事情就会编译。 但是,如果我以lambda形式内联函数,则编译器会说 未报告的异常X; 必须被抓住或宣布被抛出 更新 :原来错误消息由maven缩写。如果直接使用javac编译,则错误为: 另请参阅此处以获取可运行的测试代

  • lambdas和streams的概念有点弱,所以可能有些东西真的没有任何意义,但我会尝试表达我想要发生的事情。 我有一个类发票,其中有一个项目名称,价格,和数量。我必须映射项目名称和总成本(价格*数量)。 这将在多个发票对象上完成。 此外,我需要排序他们的总数,也过滤那些超过一定的数量,例如。100.把它们放进地图后我该怎么做?

  • 我想知道是否有人能向我解释以下奇怪之处。我正在使用Java8更新11。 给定此方法 如果我首先构造一个函数对象,并将其传递给上面的方法,事情就会编译。 但是,如果我将函数作为lambda内联,编译器会说 未报告的异常X;必须被抓到或宣布被抛出 更新:原来错误消息是由maven缩写的。如果直接使用javac编译,错误是: 另请参阅此处以获取可运行的测试代码。