我有一个包含可变数量字典的列表,例如:
var = [ {'a': 1, 'b': 2}, {'b': 20, 'a': 10, 'c': 30}, {'c': 300, 'a': 100} ]
我需要提取所有字典共有的键,列出它们的关联值,从中创建一个新字典,并将其存储在同一个变量中:
预期结果是:
var = { 'a': [1, 10, 100] }
我可以找到键的交集:
[k for k in var[0] if all(k in d for d in var[1:])]
但是如何完成其余的转换呢?
拥有通用键后,您可以使用字典理解并将值设置为嵌套列表理解:
笔记:
要找到公共键,您可以将字典转换为集合(这将仅使用键创建一个集合),然后使用集合交集:
一旦你知道了你关心的键,只需迭代并拉取它们即可:
单行也是可能的(因为你已经保证所有的键都存在
dict
),考虑到它在一行中塞入了多少含义,它有点难看:在这种情况下,one-liner 还可以,只是如果需要修改它的话灵活性会稍差一些;显式循环更容易调整,但更冗长。
旁注:有一种更简单/更快的方法来计算公共密钥:
这会将第一个的键转换
dict
为 aset
,然后允许set
' 的intersection
方法在 C 层的一次调用中生成交集(它的操作方式与您的代码没有显着不同,但它避免了大量的解释器开销) 。您甚至可以将
var
其更改为:set
如果common_keys
根本var
不包含s,这将产生一个空dict
(您选择取决于场景;如果空var
是一个错误,那么大声地死去比默默地做无效的工作要好)。将这两部分结合起来,将让您实现真正可怕的解决方案,作为一个完整的一体化内衬:
但这确实是可怕的代码,所以我建议将其分开一点。