按关键字后缀拆分字典



我有一本这样的字典

d = {"key_a":1, "anotherkey_a":2, "key_b":3, "anotherkey_b":4}

因此,值和关键字名称在这里并不重要。关键(并非双关语(是,在我上面的例子中,相关密钥共享相同的后缀,即_a_b

这些后缀是而不是已知的(例如,它们并不总是_a_b,并且有未知数量的不同后缀。

我想做的是将相关的关键字提取到自己的字典中,并将所有生成的字典都放在一个列表中。上面的输出将是

output = [{"key_a":1, "anotherkey_a":2},{"key_b":3, "anotherkey_b":4}]

我目前的方法是首先获取所有后缀,然后一次生成一个子dict,并将其附加到新列表中

output = list()
# Generate a set of suffixes
suffixes = set([k.split("_")[-1] for k in d.keys()])
# Create the subdict and append to output
for suffix in suffixes:
output.append({k:v for k,v in d.items() if k.endswith(suffix)})

这个很有效(而且速度不会太慢或太快(,但我只是想知道是否有更优雅的方法可以通过列表或听写理解来做到这一点?只是出于兴趣。。。

将输出设为defaultdict,而不是列表,并使用后缀作为键:

from collections import defaultdict
output = defaultdict(lambda: {})
for k, v in d.items():
prefix, suffix = k.rsplit('_', 1)
output[suffix][k] = v

这将把你的dict拆分成一个通行证,并产生类似于的结果

output={"a":{"key_a":1,"anotherkey_a":2},"b":{"key_b":3,"anoherkey_b":4}}

如果您坚持将其转换为列表,您可以简单地使用:

output = list(output.values())

您可以压缩行

output = list()
for suffix in suffixes:
output.append({k:v for k,v in d.items() if k.endswith(suffix)})

到列表理解,比如这个

[{k:v for k,v in d.items() if k.endswith(suffix)} for suffix in suffixes]

它是否更优雅可能在旁观者的眼中。

不过,如果字典很大,@BłotosmÉtek建议的方法可能会更快,因为它可以减少循环。

def sub_dictionary_by_suffix(dictionary, suffix):
sub_dictionary = {k: v for k, v in dictionary.items() if k.endswith(suffix)}
return sub_dictionary

我希望它能帮助

最新更新