根据python中的键列表过滤Dict列表

时间:2016-11-02 19:26:30

标签: python python-3.x

我正在尝试根据另一个键列表过滤dict列表。请参阅以下示例。

# Input list of dict
lst_dict=[{'TABLE_NAME':'TEST1','COLUMN_NAME':'TEST_COLUMN','COLUMN_DATA_TYPE': 'varchar'},
        {'TABLE_NAME': 'TEST1', 'COLUMN_NAME': 'TEST_COLUMN2', 'COLUMN_DATA_TYPE': 'varchar'}, 
        {'COLUMN_DATA_TYPE': 'varchar','TABLE_NAME': 'TEST2','COLUMN_NAME': 'TEST_COLUMN1'}]
# Key List
key_lst = ['TABLE_NAME','COLUMN_NAME']

我的预期输出:

[{'TABLE_NAME': 'TEST2', 'COLUMN_NAME': 'TEST_COLUMN1'}, {'TABLE_NAME': 'TEST1', 'COLUMN_NAME': 'TEST_COLUMN'}, {'TABLE_NAME': 'TEST1', 'COLUMN_NAME': 'TEST_COLUMN2'}]

我编写了下面的代码,但它只返回列表中的1个dict而不是3.(根据我的例子)

new_list = [{k:v for i in lst_dict for k,v in i.items() if k in key_lst}]

我不确定我错在哪里..感谢任何建议!

2 个答案:

答案 0 :(得分:2)

您编写new_list的方式,看起来您希望它是一个列表理解,但它只是一个包含单个项目的列表,这是一个词典理解。您可能希望将迭代器从lst_dict移出字典并进入列表。它应该是这样的:

new_list = [{k:v for k,v in i.items() if k in key_lst} for i in lst_dict]

答案 1 :(得分:1)

您可以将列表理解 dict comprehension 一起使用:

Public Sub InitGrid(Optional myValue As Boolean = False)
  If Me.InvokeRequired Then
    Me.Invoke(New Action(Of Boolean)(AddressOf InitGrid), myValue)
  Else
    MessageBox.Show(myValue.ToString())
  End If
End Sub

其中>>> my_list = [{key: sub_dict.get(key) for key in key_lst} for sub_dict in lst_dict] # using "dict.get('key')" in case key is not present in sub dicts in example >>> my_list [{'TABLE_NAME': 'TEST1', 'COLUMN_NAME': 'TEST_COLUMN'}, {'TABLE_NAME': 'TEST1', 'COLUMN_NAME': 'TEST_COLUMN2'}, {'TABLE_NAME': 'TEST2', 'COLUMN_NAME': 'TEST_COLUMN1'}] lst_dict持有问题中提到的值。

您尝试的问题是您没有为列表中的子词组创建单独的key_lst