【问题标题】:Filter a dictionary from a list of keys从键列表中过滤字典
【发布时间】:2020-04-08 03:16:18
【问题描述】:

我想根据键的集合/列表/(字典)过滤字典。

目前我正在使用这样的生成器:

def filter_dict(in_dict, in_iterator):
    for key, value in in_dict.items():
        if key in in_iterator:
            yield key, value


d = {'one': 1, 'two': 2, 'three': 3}
l = ['one', 'two']

for key, value in filter_dict(d, l):
    print(key, value)

效果很好并且可以正确过滤结果:

one 1
two 2

有没有更好或更标准化的方法来做到这一点?

也许像filter(d, l)d.items(l)

【问题讨论】:

    标签: python list loops dictionary generator


    【解决方案1】:

    您可以简单地遍历列表并从字典中挑选项目并创建一个新字典,而不是遍历所有键然后检查它是否存在于另一个列表中。

    new_dict = dict( ((key, d[key]) for key in l) )
    

    【讨论】:

    • 是的,你是对的。在这种情况下,生成器应该遍历列表并返回 dict 项(如果存在)。
    • 或者只使用字典理解:{k: d[k] for k in l}。这避免了元组的生成器表达式/显式构造。
    • 然后在上面的示例中变为for key, value in {k: d[k] for k in l}.items() 如果l 包含不存在的密钥d,则这两个示例都会出错
    【解决方案2】:

    一种可能性是对dict.keys() 执行设置操作:

    d = {'one': 1, 'two': 2, 'three': 3}
    l = ['one', 'two']
    
    for k in d.keys() & set(l):
        print(k, d[k])
    

    打印:

    one 1
    two 2
    

    【讨论】:

    • 太棒了!和一个很好的解决方案。但也许我们失去了一点可读性?
    【解决方案3】:

    如果您的列表中的项目不在您的字典中,则使用此命令会出错:
    完成它大约需要 5 秒

    new_dict = dict(((key, d[key]) for key in l))
    

    你可以使用这样的东西:

    如果您的列表中的项目不在您的字典中,您可以确定不会收到错误

    keys = set(l).intersection(d)
    result = {key:d[key] for key in keys}
    

    但它需要大约 17 秒,而且性能不佳

    你可以使用它,完成它大约需要 5 秒,你可以确定你不会收到任何错误:

    result = {}
    for k in set(d1).intersection(l1):
        result[k]= d1[k]
    

    【讨论】:

    • 非常感谢您的回答和时间比较。根据问题,您的建议是否如下? for key in set(d).intersection(l):
    猜你喜欢
    • 2022-12-02
    • 1970-01-01
    • 1970-01-01
    • 2018-05-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-17
    • 2020-09-11
    • 2020-02-06
    相关资源
    最近更新 更多