python - 使用两个键在 A 中而不是 B 中创建字典列表
问题描述
这是对上一个问题的更复杂的编辑。以前我问过只用一个键,现在我想了解如何使用两个键:
假设有一个名为 list_a 的字典列表:
list_a = [
{'x' : 1, 'y': 10, 'z': 100},
{'x' : 1, 'y': 11, 'z': 100},
{'x' : 1, 'y': 12, 'z': 100},
{'x' : 2, 'y': 10, 'z': 200},
{'x' : 2, 'y': 11, 'z': 200},
{'x' : 2, 'y': 12, 'z': 200}
]
假设有一个派生列表使用 list_a 中字典中的键“x”。这个列表将被称为 list_b:
list_b = [
{'x' : 1, 'y': 10, 'fruit': 'orange'},
{'x' : 1, 'y': 12, 'fruit': 'apple'},
{'x' : 2, 'y': 12, 'fruit': 'banana'}
]
请注意, list_a 和 list_b 没有包含相同键的字典。唯一等效的键是“x”和“y”。否则,这些词典完全不同。另请注意,list_b 键值相对于原始 list_a 是乱序的。
您将如何生成一个包含 list_a 成员且 x,y 值不在 list_b 中的列表?
例如一个名为 list_c 的列表:
list_c = [
{'x' : 1, 'y': 11, 'z': 100},
{'x' : 2, 'y': 10, 'z': 200},
{'x' : 2, 'y': 11, 'z': 200}
]
以前,有人回答说要在一个键“x”上执行此操作,需要:
list_b_set = {b['x'] for b in list_b}
list_c = [a for a in list_a if a['x'] not in list_b_set]
我怎样才能在此基础上为“x”和“y”构建?
解决方案
感谢评论鼓励我自己解决这个问题。
对于那些试图在以下方面查找文档的迷路的初学者:
[x for x in y if condition]
这叫做理解。我刚开始使用 python,不知道这个东西有一个合适的名字。谷歌搜索也很困难,因为它是由符号和介词组成的。现在您知道并且可以查看所有关于理解的文档!
这是解决方案,一旦我查看了理解如何处理两个元素而不是一个元素,它就非常简单
list_a = [
{'x' : 1, 'y': 10, 'z': 100},
{'x' : 1, 'y': 11, 'z': 100},
{'x' : 1, 'y': 12, 'z': 100},
{'x' : 2, 'y': 10, 'z': 200},
{'x' : 2, 'y': 11, 'z': 200},
{'x' : 2, 'y': 12, 'z': 200}
]
list_b = [
{'x' : 1, 'y': 10, 'fruit': 'orange'},
{'x' : 1, 'y': 12, 'fruit': 'apple'},
{'x' : 2, 'y': 12, 'fruit': 'banana'}
]
list_c = [
{'x' : 1, 'y': 11, 'z': 100},
{'x' : 2, 'y': 10, 'z': 200},
{'x' : 2, 'y': 11, 'z': 200}
]
list_b_set = {(b['x'], b['y']) for b in list_b}
list_c_new = [a for a in list_a if (a['x'],a['y']) not in list_b_set]
list_c_new == list_c
推荐阅读
- c# - 如何将 BindingBase 属性绑定到 Xamarin 中的变量
- php - 通过json在php中递归调用
- git - 将分支复制到 master 并推送到远程
- highcharts - Highcharts - 是否可以让标记仅在导航器中可见,而在主图表中不可见?
- android - 抑制 Flutter 包 UI 以使用我自己的 UI
- javascript - 根据用户位置连续移动标记
- python - gettext:如何避免 unicode 字符失败?
- java - 数据绑定 - ActivityMainBinding.java 错误:参数过多
- php - 更新图像数组
- maven - 如何为 maven 的 jacoco 插件指定输出格式?