首页 > 解决方案 > 使用两个键在 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”构建?

标签: pythondictionary

解决方案


感谢评论鼓励我自己解决这个问题。

对于那些试图在以下方面查找文档的迷路的初学者:

[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


推荐阅读