【问题标题】:Most efficient method to find values in nested dict在嵌套字典中查找值的最有效方法
【发布时间】:2021-03-17 02:18:18
【问题描述】:

假设我有下面的字典

{
    "1": {
        "rarity": 1
    },
    "2": {
        "rarity": 2
    }
}

我想找到rarity 的次数是 1。而不是做

count = 0
for x in dict.values():
    if x['rarity'] == 1:
         count += 1
return count

有没有更好的方法来做到这一点?我发现this 发布了关于使用map 的帖子,但我不确定如何让它与嵌套字典一起使用。

【问题讨论】:

  • 我的写法就是sum(1 for v in d.values() if v["rarity"] == 1)
  • 您有兴趣了解它的工作原理还是只想在某个地方使用它?
  • 高效?凭什么?此外,您的代码似乎没有按照您说的去做。
  • @jizhihaoSAMA 只有这么小的样本集,count 将是 1。@MateenUlhaq 我想我正在寻找“正确”的方式。我觉得我的作品有效,但这不合适,因为它在 for 循环中迭代每个值,而我认为 maplambda 可能会起作用。还有x==4 应该是x['rarity']==1,我的错。
  • @MateenUlhaq 可以更短 sum 也算真值 sum(v["rarity"] == 1 for v in d.values())

标签: python dictionary


【解决方案1】:

你可以写得更短:

count = sum(v["rarity"] == 1 for v in d.values())

来自rioV8comment,灵感来自Mateen Ulhaqcomment

【讨论】:

    【解决方案2】:

    您可以在地图上使用以下辅助函数。

    def functionHelper(value):
        if value["rarity"] == 1:
            return 1
        return 0
    sum(map(functionHelper, d.values()))
    

    或者您可以使用以下之一:

    sum(map((1).__eq__, [v["rarity"] for v in d.values()]))
    sum(v["rarity"] == 1 for v in d.values())
    

    【讨论】:

    • 我认为您不小心将后两个选项结合在一起,所以我进行了编辑以修复它。
    • 第二个map 选项有一些问题。请改用生成器表达式。 1) 对列表理解执行map 意味着首先创建整个列表,然后然后 映射。这是没有意义的,并且对于大型d 来说效率很低。 2)强烈避免使用像int.__eq__这样的dunder方法。作为比较,int.__sub__(float) instead of int - float doesn't work。 3)它更长更难阅读。
    猜你喜欢
    • 1970-01-01
    • 2015-07-18
    • 1970-01-01
    • 2014-03-02
    • 2022-10-12
    • 2013-10-23
    • 1970-01-01
    • 2014-05-18
    • 1970-01-01
    相关资源
    最近更新 更多