【问题标题】:The best way to filter a dictionary in Python [duplicate]在Python中过滤字典的最佳方法[重复]
【发布时间】:2012-01-15 12:55:42
【问题描述】:

我有一个字符串键和浮点值字典。

 mydict = {}
 mydict["joe"] = 20
 mydict["bill"] = 20.232
 mydict["tom"] = 0.0

我想过滤字典以仅包含值大于零的对。

在 C# 中,我会这样做:

   dict = dict.Where(r=>r.Value > 0);

Python 中的等价代码是什么?

【问题讨论】:

    标签: python dictionary lambda


    【解决方案1】:
    d = dict((k, v) for k, v in d.iteritems() if v > 0)
    

    在 Python 2.7 及更高版本中,有更好的语法:

    d = {k: v for k, v in d.items() if v > 0}
    

    请注意,这并不是严格意义上的过滤器,因为它确实会创建一个新字典。

    【讨论】:

    • 如果要按键过滤怎么办?
    • 把它改成测试k而不是v?
    【解决方案2】:

    试试

    y = filter(lambda x:dict[x] > 0.0,dict.keys())
    

    lambda 是从字典中输入键,并将字典中每个键的值与条件进行比较,返回可接受的键。

    【讨论】:

    • 发问者正在寻找返回字典,这只返回字典的键。而且它的效率/Pythonic 比@kindall 的答案低
    • 可能是这样的:d = dict(filter(lambda x: x[1] > 0.0, d.items()))
    【解决方案3】:

    首先,您不应该使用关键字dict 作为变量名,因为它会污染命名空间,并阻止您在当前或嵌入范围内引用dict 类。

    d = {}
    d["joe"] = 20
    d["bill"] = 20.232
    d["tom"] = 0.0
    
    # create an intermediate generator that is fed into dict constructor 
    # via a list comprehension
    # this is more efficient that the pure "[...]" variant
    d2 = dict(((k, v) for (k, v) in d.iteritems() if v > 0)) 
    
    print d2
    # {'bill': 20.232, 'joe': 20}
    

    或者,您可以直接在其上创建生成器和迭代器。这更像是一个“过滤器”,因为生成器只引用原始字典中的值,而不是制作子集副本;因此比创建新字典更有效:

    filtered = ((k, v) for (k, v) in d.iteritems() if v > 0)
    
    print filtered 
    # <generator object <genexpr> at 0x034A18F0>
    
    for k, v in filtered:
        print k, v
    
    # bill 20.232
    # joe 20
    

    【讨论】:

      【解决方案4】:
      foo = {}
      foo["joe"] = 20
      foo["bill"] = 20.232
      foo["tom"] = 0.0
      
      bar = dict((k,v) for k,v in foo.items() if v>0)
      

      dict 是 Python 中的关键字,所以我将其替换为 foo。

      【讨论】:

        【解决方案5】:

        dict 构造函数可以采用一系列 (key,value) 对,而 dict 的 iteritems 方法产生一系列 (key,value) 对。两种美妙的味道在一起味道很好。

        newDict = dict([item for item in oldDict.iteritems() if item[1] > 0])
        

        【讨论】:

          【解决方案6】:

          假设您的原始字典是 d1,您可以使用以下内容:

          d2 = dict((k, v) for k, v in d1.items() if v > 0)
          

          顺便注意dict已经在python中保留了。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2011-01-24
            • 2016-06-17
            • 2013-08-17
            • 2019-03-12
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多