如何使用另一个字典筛选字典?

huangapple go评论120阅读模式
英文:

How to filter a dictionary using another dictionary?

问题

我有两组字典。我们称它们为A和B。我需要能够创建第三个字典C,其中包含A的所有键和相关值,除了在B中的那些键值对。这是我到目前为止尝试过的:

  1. A = {"A": {"B": 6, "C": 5}, "B": {"A": 6, "D": 7, "E": 5}, "C": {"A": 5}, "D": {"B": 7, "E": 10, "H": 25},
  2. "E": {"D": 10, "F": 14, "B": 5}, "F": {"E": 14}, "H": {"D": 25}}
  3. B = {"A": "C"}
  4. C = A
  5. for key, value in A.items():
  6. C.update({key: value})
  7. if key in B:
  8. for i in value:
  9. if i not in B.values():
  10. C[key].pop(i)
  11. print(C)

思路是,给定这两个字典,得到输出:

  1. 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:

  1. A = {"A": {"B": 6, "C": 5}, "B": {"A": 6, "D": 7, "E": 5}, "C": {"A": 5}, "D": {"B": 7, "E": 10, "H": 25},
  2. "E": {"D": 10, "F": 14, "B": 5}, "F": {"E": 14}, "H": {"D": 25}}
  3. B = {"A": "C"}
  4. C = A
  5. for key, value in A.items():
  6. C.update({key: value})
  7. if key in B:
  8. for i in value:
  9. if i not in B.values():
  10. C[key].pop(i)
  11. print(C)

The idea is, given the two dictionaries, to obtain the output:

  1. 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

你可以使用字典推导式:

  1. A = {
  2. "A": {"B": 6, "C": 5},
  3. "B": {"A": 6, "D": 7, "E": 5},
  4. "C": {"A": 5},
  5. "D": {"B": 7, "E": 10, "H": 25},
  6. "E": {"D": 10, "F": 14, "B": 5},
  7. "F": {"E": 14},
  8. "H": {"D": 25},
  9. }
  10. B = {"A": "C"}
  11. C = {
  12. k: {kk: vv for kk, vv in v.items() if not (k in B and B[k] == kk)}
  13. for k, v in A.items()
  14. }
  15. print(C)

输出结果:

  1. {
  2. "A": {"B": 6},
  3. "B": {"A": 6, "D": 7, "E": 5},
  4. "C": {"A": 5},
  5. "D": {"B": 7, "E": 10, "H": 25},
  6. "E": {"D": 10, "F": 14, "B": 5},
  7. "F": {"E": 14},
  8. "H": {"D": 25},
  9. }
英文:

You can use dict comprehension:

  1. A = {
  2. "A": {"B": 6, "C": 5},
  3. "B": {"A": 6, "D": 7, "E": 5},
  4. "C": {"A": 5},
  5. "D": {"B": 7, "E": 10, "H": 25},
  6. "E": {"D": 10, "F": 14, "B": 5},
  7. "F": {"E": 14},
  8. "H": {"D": 25},
  9. }
  10. B = {"A": "C"}
  11. C = {
  12. k: {kk: vv for kk, vv in v.items() if not (k in B and B[k] == kk)}
  13. for k, v in A.items()
  14. }
  15. print(C)

Prints:

  1. {
  2. "A": {"B": 6},
  3. "B": {"A": 6, "D": 7, "E": 5},
  4. "C": {"A": 5},
  5. "D": {"B": 7, "E": 10, "H": 25},
  6. "E": {"D": 10, "F": 14, "B": 5},
  7. "F": {"E": 14},
  8. "H": {"D": 25},
  9. }

答案2

得分: 0

我认为你想要的是:

  1. import pprint
  2. A = {
  3. "A": {"B": 6, "C": 5},
  4. "B": {"A": 6, "D": 7, "E": 5},
  5. "C": {"A": 5},
  6. "D": {"B": 7, "E": 10, "H": 25},
  7. "E": {"D": 10, "F": 14, "B": 5},
  8. "F": {"E": 14},
  9. "H": {"D": 25},
  10. }
  11. B = {"A": "C"}
  12. C = {}
  13. for k, v in A.items():
  14. for kk, vv in v.items():
  15. if k in B and B[k] == kk:
  16. continue
  17. C.setdefault(k, {})[kk] = vv
  18. pprint.pprint(C)

根据你的示例输入,会产生以下输出:

  1. {'A': {'B': 6},
  2. 'B': {'A': 6, 'D': 7, 'E': 5},
  3. 'C': {'A': 5},
  4. 'D': {'B': 7, 'E': 10, 'H': 25},
  5. 'E': {'B': 5, 'D': 10, 'F': 14},
  6. 'F': {'E': 14},
  7. 'H': {'D': 25}}
英文:

I think you want:

  1. import pprint
  2. A = {
  3. "A": {"B": 6, "C": 5},
  4. "B": {"A": 6, "D": 7, "E": 5},
  5. "C": {"A": 5},
  6. "D": {"B": 7, "E": 10, "H": 25},
  7. "E": {"D": 10, "F": 14, "B": 5},
  8. "F": {"E": 14},
  9. "H": {"D": 25},
  10. }
  11. B = {"A": "C"}
  12. C = {}
  13. for k, v in A.items():
  14. for kk, vv in v.items():
  15. if k in B and B[k] == kk:
  16. continue
  17. C.setdefault(k, {})[kk] = vv
  18. pprint.pprint(C)

Which given your sample input produces:

  1. {'A': {'B': 6},
  2. 'B': {'A': 6, 'D': 7, 'E': 5},
  3. 'C': {'A': 5},
  4. 'D': {'B': 7, 'E': 10, 'H': 25},
  5. 'E': {'B': 5, 'D': 10, 'F': 14},
  6. 'F': {'E': 14},
  7. 'H': {'D': 25}}

huangapple
  • 本文由 发表于 2023年6月5日 00:34:14
  • 转载请务必保留本文链接:https://go.coder-hub.com/76401402.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定