Python 根据密钥列表将一个dict的一部分复制到新dict

Python 根据密钥列表将一个dict的一部分复制到新dict,python,dictionary,Python,Dictionary,样本: 我想创建一个新的dict,它只包含第一个dict中键出现在列表中的项目。换句话说,我想要: d = { "test": 1, "sample": 2, "example": 3, "product": 4, "software": 5, "demo": 6, } filter_keys = ["test","sample","example","demo"] 我可以用一个循环: d2 = { "test": 1, "sa

样本:

我想创建一个新的dict,它只包含第一个dict中键出现在列表中的项目。换句话说,我想要:

d = {
    "test": 1,
    "sample": 2,
    "example": 3,
    "product": 4,
    "software": 5,
    "demo": 6,
}

filter_keys = ["test","sample","example","demo"]
我可以用一个循环:

d2 = {
    "test": 1,
    "sample": 2,
    "example": 3,
    "demo": 6,
}
但这似乎非常“非蟒蛇式”。我还猜测,如果你有一个巨大的dict,比如说5000个项目左右,不断地向新dict添加新项目会比直接的方式慢

此外,您还希望能够处理错误。如果列表中包含的内容不是dict中的键,那么应该忽略它。或者它被添加到新的dict中,但值为None


有没有更好的方法来实现这一点?

为了获得最佳性能,您应该迭代列表中的键,并检查它们是否在dict中,而不是相反:

d2 = {}
for k in d.keys():
    if (k in filter_keys): 
        d2[k] = d[k]
这里的好处是
dict.\uu在
dict
上包含的
是O(1),而列表中是O(N)。对于大列表,这是一个巨大的好处(O(N)算法与O(N^2))相比)

我们可以用等效的dict理解来表达上述循环,从而更加简洁:

d2 = {}
for k in list_of_keys:
    if k in d:
       d2[k] = d[k]
>>> d = {
...     "test": 1,
...     "sample": 2,
...     "example": 3,
...     "product": 4,
...     "software": 5,
...     "demo": 6,
... }
>>>
>>> l = ["test","sample","example","demo"]
>>> new_d = {k: v for k, v in d.items() if k in l}
>>> new_d
{'sample': 2, 'demo': 6, 'test': 1, 'example': 3}

这可能比循环稍微快一点,但可能还不足以让人担心。也就是说,大多数python程序员更喜欢这个版本,因为它更简洁、更普通。

为了获得最佳性能,您应该迭代列表中的键,并检查它们是否在dict中,而不是相反:

d2 = {}
for k in d.keys():
    if (k in filter_keys): 
        d2[k] = d[k]
这里的好处是
dict.\uu在
dict
上包含的
是O(1),而列表中是O(N)。对于大列表,这是一个巨大的好处(O(N)算法与O(N^2))相比)

我们可以用等效的dict理解来表达上述循环,从而更加简洁:

d2 = {}
for k in list_of_keys:
    if k in d:
       d2[k] = d[k]
>>> d = {
...     "test": 1,
...     "sample": 2,
...     "example": 3,
...     "product": 4,
...     "software": 5,
...     "demo": 6,
... }
>>>
>>> l = ["test","sample","example","demo"]
>>> new_d = {k: v for k, v in d.items() if k in l}
>>> new_d
{'sample': 2, 'demo': 6, 'test': 1, 'example': 3}

这可能比循环稍微快一点,但可能还不足以让人担心。也就是说,大多数python程序员更喜欢这个版本,因为它更简洁、更普通。

字典理解是一种方法:

d2 = {k: d[k] for k in list_of_keys if k in d} 
演示:


词典理解是一种方法:

d2 = {k: d[k] for k in list_of_keys if k in d} 
演示:


要做到这一点,一个简单的方法是使用“词典理解”:

注意,如果条件出现在理解的末尾,它会过滤循环语句的执行。根据字典中的键数是否大于要筛选的键数,此修订版可能更有效:

filtered_dict = {key: value for key, value in d.items() if key in filter_keys}
检查字典中的成员身份(
key in d
)比检查筛选关键字列表中的成员身份(
key in filter\u keys
)要快得多。但是,哪一个更快取决于过滤器键列表的大小(在较小程度上取决于字典的大小)

使用
dict
构造函数是一种相对python的方法,它不需要词典理解:

filtered_dict = {key: d[key] for key in filter_keysif key in d}

请注意,这在本质上等同于字典理解,但如果您不熟悉字典理解语法,可能会更清楚。

一个简单的方法是使用“字典理解”:

注意,如果条件出现在理解的末尾,它会过滤循环语句的执行。根据字典中的键数是否大于要筛选的键数,此修订版可能更有效:

filtered_dict = {key: value for key, value in d.items() if key in filter_keys}
检查字典中的成员身份(
key in d
)比检查筛选关键字列表中的成员身份(
key in filter\u keys
)要快得多。但是,哪一个更快取决于过滤器键列表的大小(在较小程度上取决于字典的大小)

使用
dict
构造函数是一种相对python的方法,它不需要词典理解:

filtered_dict = {key: d[key] for key in filter_keysif key in d}

请注意,这本质上等同于词典理解,但如果您不熟悉词典理解语法,可能会更清楚。

根据问题的最后一部分:

或者它被添加到新的dict中,但值为None


您可以将默认返回值传递给
dict.get
,默认为
None
,但您可以将其设置为
d.get(k,“无匹配”)
等。。或者你想要的任何价值。

根据问题的最后部分:

或者它被添加到新的dict中,但值为None


您可以将默认返回值传递给
dict.get
,默认为
None
,但您可以将其设置为
d.get(k,“无匹配”)
等。。或者任何您想要的值。

无需构建一个列表来传递给dict构造函数——生成器表达式就可以了。字典理解能力非常棒。我一直在使用列表理解,但我从来不知道你可以用dict做同样的事情。@fdmillion--是的,它们是在python2.7中与集合理解一起添加的,例如:
{x*x for x in something}
是的,列表是不必要的。您可以为d中的key,value编写
dict((key,value)。items()如果是l中的key)
,这将把一个生成器传递到
dict
构造函数中。在这种情况下,它们的速度可能差不多。不需要构建一个列表来传递给dict构造函数——生成器表达式就可以了。字典理解能力非常棒。我一直在使用列表理解,但我从来不知道你可以用dict做同样的事情。@fdmillion--是的,它们是在python2.7中与集合理解一起添加的,例如:
{x*x for x in something}
是的,列表是不必要的。您可以为d中的key,value编写
dict((key,value)。items()如果是l中的key)
,这将把一个生成器传递到
dict
构造函数中。在这种情况下,它们的速度可能差不多。@EML,想想逻辑,为什么要迭代完整的dict而不仅仅是fou