如何在删除每个字典的子集时合并字典对

Posted

技术标签:

【中文标题】如何在删除每个字典的子集时合并字典对【英文标题】:How to merge pairs of dictionaries while dropping a subset of each dictionary 【发布时间】:2017-06-23 20:16:44 【问题描述】:

问题陈述:

我正在使用 python 3.5 并且喜欢新的字典合并语法:

 merged = **A, **B

但是,如果您只想要 AB 中的某个键子集怎么办?

 A_keys = [some small subset of the keys from A]
 B_keys = [some small subset of the keys from B]

 merged = ???

【问题讨论】:

没有速记。 @Prune 问题没有问题 我会选择两个简单的循环:merged = for k in A_keys: merged[k] = A[k]B 也一样。 【参考方案1】:

您可以将新符号与the answer 结合起来解决有关如何从字典中选择某些键的问题:

merged =  ** k:A[k] for k in A.keys() & A_keys , ** k:B[k] for k in B.keys() & B_keys 

即使 A_keys 或 B_keys 中的某些值不是 A 或 B 中的真正键,这也有效。

【讨论】:

【参考方案2】:

解救字典:

A =  'one': '1', 'two': '2', 'three': '3' 
B =  'four': '4', 'five': '5', 'six': '6' 
A_keys = ['one', 'two']
B_keys = ['five']
merged = **k:v for k,v in A.items() if k in A_keys, **k:v for k,v in B.items() if k in B_keys

【讨论】:

这绝对解决了问题,但不太优雅(我认为实际上是三个 dict 理解)。我等着看有没有python高手有什么袖手旁观的,否则我会接受这个。 好吧,你可以只用两个推导式来做到这一点,但你不会使用闪亮的新合并语法,它也不会那么富有表现力:merged = k:v for k,v in A.items() if k in A_keys; merged.update(k:v for k,v in B.items() if k in B_keys)【参考方案3】:

您可以通过调用要从两个集合中合并的特定键来访问。

  dict1 = 'bookA': 1, 'bookB': 2, 'bookC': 3
  dict2 = 'bookC': 2, 'bookD': 4, 'bookE': 5

合并所需的键

print (dict1['bookA'] + dict2['bookB'])

结果:

'bookE': 5, 'bookD': 4, 'bookB': 2, 'bookA': 1, 'bookC': 3

或者您可以将结果存储到新字典中。

y = dict1['bookA'] + dict2['bookB']

print (y)

【讨论】:

谁对我的回答给出了负面反馈,有什么问题? 几乎所有东西,恐怕。 dict1['bookA'] + dict2['bookB'] 抛出异常。即使它有效,结果也不会是字典。

以上是关于如何在删除每个字典的子集时合并字典对的主要内容,如果未能解决你的问题,请参考以下文章

Python - 如何有效地遍历字典的子集?

python - 如何在更改python中的值时合并一个嵌套字典和一个简单字典?

如何在Python中合并字典中的所有数据框[重复]

python基于条件规则构建已有字典的子集

如何将两个相似的嵌套字典合并为一个,每个字典都有一些共享和独特的嵌套元素(Python)?

如何从 2 个 pkl 文件创建 Python 嵌套字典/将 2 个嵌套字典合并为一个?