英文:
How to filter a dictionary using another dictionary?
问题
我有两组字典。我们称它们为A和B。我需要能够创建第三个字典C,其中包含A的所有键和相关值,除了在B中的那些键值对。这是我到目前为止尝试过的:
A = {"A": {"B": 6, "C": 5}, "B": {"A": 6, "D": 7, "E": 5}, "C": {"A": 5}, "D": {"B": 7, "E": 10, "H": 25},
"E": {"D": 10, "F": 14, "B": 5}, "F": {"E": 14}, "H": {"D": 25}}
B = {"A": "C"}
C = A
for key, value in A.items():
C.update({key: value})
if key in B:
for i in value:
if i not in B.values():
C[key].pop(i)
print(C)
思路是,给定这两个字典,得到输出:
A = {"A": {"B": 6}, "B": {"A": 6, "D": 7, "E": 5}, "C": {"A": 5}, "D": {"B": 7, "E": 10, "H": 25}, "E": {"D": 10, "F": 14, "B": 5}, "F": {"E": 14}, "H": {"D": 25}}
但是,终端返回错误,说在迭代过程中字典大小已经改变。我在这里到底做错了什么?
英文:
I have two sets of dictionaries. Let's call them A and B. I need to be able to create a third dictionary, C, which has all the keys and associated values of A, except for the pairs that are in B. This is what I have tried so far:
A = {"A": {"B": 6, "C": 5}, "B": {"A": 6, "D": 7, "E": 5}, "C": {"A": 5}, "D": {"B": 7, "E": 10, "H": 25},
"E": {"D": 10, "F": 14, "B": 5}, "F": {"E": 14}, "H": {"D": 25}}
B = {"A": "C"}
C = A
for key, value in A.items():
C.update({key: value})
if key in B:
for i in value:
if i not in B.values():
C[key].pop(i)
print(C)
The idea is, given the two dictionaries, to obtain the output:
A = {"A": {"B": 6}, "B": {"A": 6, "D": 7, "E": 5}, "C": {"A": 5}, "D": {"B": 7, "E": 10, "H": 25}, "E": {"D": 10, "F": 14, "B": 5}, "F": {"E": 14}, "H": {"D": 25}}
Instead, the terminal returns an error, saying that the dictionary has changed size during the iteration. What exactly am I doing wrong here?
答案1
得分: 1
你可以使用字典推导式:
A = {
"A": {"B": 6, "C": 5},
"B": {"A": 6, "D": 7, "E": 5},
"C": {"A": 5},
"D": {"B": 7, "E": 10, "H": 25},
"E": {"D": 10, "F": 14, "B": 5},
"F": {"E": 14},
"H": {"D": 25},
}
B = {"A": "C"}
C = {
k: {kk: vv for kk, vv in v.items() if not (k in B and B[k] == kk)}
for k, v in A.items()
}
print(C)
输出结果:
{
"A": {"B": 6},
"B": {"A": 6, "D": 7, "E": 5},
"C": {"A": 5},
"D": {"B": 7, "E": 10, "H": 25},
"E": {"D": 10, "F": 14, "B": 5},
"F": {"E": 14},
"H": {"D": 25},
}
英文:
You can use dict comprehension:
A = {
"A": {"B": 6, "C": 5},
"B": {"A": 6, "D": 7, "E": 5},
"C": {"A": 5},
"D": {"B": 7, "E": 10, "H": 25},
"E": {"D": 10, "F": 14, "B": 5},
"F": {"E": 14},
"H": {"D": 25},
}
B = {"A": "C"}
C = {
k: {kk: vv for kk, vv in v.items() if not (k in B and B[k] == kk)}
for k, v in A.items()
}
print(C)
Prints:
{
"A": {"B": 6},
"B": {"A": 6, "D": 7, "E": 5},
"C": {"A": 5},
"D": {"B": 7, "E": 10, "H": 25},
"E": {"D": 10, "F": 14, "B": 5},
"F": {"E": 14},
"H": {"D": 25},
}
答案2
得分: 0
我认为你想要的是:
import pprint
A = {
"A": {"B": 6, "C": 5},
"B": {"A": 6, "D": 7, "E": 5},
"C": {"A": 5},
"D": {"B": 7, "E": 10, "H": 25},
"E": {"D": 10, "F": 14, "B": 5},
"F": {"E": 14},
"H": {"D": 25},
}
B = {"A": "C"}
C = {}
for k, v in A.items():
for kk, vv in v.items():
if k in B and B[k] == kk:
continue
C.setdefault(k, {})[kk] = vv
pprint.pprint(C)
根据你的示例输入,会产生以下输出:
{'A': {'B': 6},
'B': {'A': 6, 'D': 7, 'E': 5},
'C': {'A': 5},
'D': {'B': 7, 'E': 10, 'H': 25},
'E': {'B': 5, 'D': 10, 'F': 14},
'F': {'E': 14},
'H': {'D': 25}}
英文:
I think you want:
import pprint
A = {
"A": {"B": 6, "C": 5},
"B": {"A": 6, "D": 7, "E": 5},
"C": {"A": 5},
"D": {"B": 7, "E": 10, "H": 25},
"E": {"D": 10, "F": 14, "B": 5},
"F": {"E": 14},
"H": {"D": 25},
}
B = {"A": "C"}
C = {}
for k, v in A.items():
for kk, vv in v.items():
if k in B and B[k] == kk:
continue
C.setdefault(k, {})[kk] = vv
pprint.pprint(C)
Which given your sample input produces:
{'A': {'B': 6},
'B': {'A': 6, 'D': 7, 'E': 5},
'C': {'A': 5},
'D': {'B': 7, 'E': 10, 'H': 25},
'E': {'B': 5, 'D': 10, 'F': 14},
'F': {'E': 14},
'H': {'D': 25}}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论