Python 根据密钥列表将一个dict的一部分复制到新dict
样本: 我想创建一个新的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
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