如何高效地从字典列表中筛选数据

3

我有一些数据存储在 tuple_listdictionaries_list 中,这两个列表中都可能包含成千上万条记录。 我想要从 dictionaries_list 中根据 tuple_list 中的记录进行筛选。目前我写了以下代码,但是由于它必须遍历字典列表的每个元素才能得到列表的元素,所以需要很长时间。

# tuple_list can be like [(('s', 45), ('t', 30)), (('s', 5), ('t', 3))]
for target_tuple in tuple_list:
    # target_tuple can have data like (('s', 45), ('t', 30))
    # dictionaries_list can have data like [{'a': 5, 's': 45, 't': 10}, {}, {}]
    if some_parameter == 'something':
        m1_dicts = [d for d in dictionaries_list if d['s'] == target_tuple[0][1]]
    else:
        m1_dicts = [d for d in dictionaries_list if d['t'] == target_tuple[0][1]]

请提供一些改进的方法,以提高这个问题的解决效率。
1个回答

1
据我所理解,如果元组列表中有任何匹配项,则您希望保留字典。由于它只运行一次元组列表,因此运行时间确实有所改善,但可能还不是最佳优化,因为它仍然需要迭代字典列表。
# taking small dataset as example
tuple_list=[(('s', 45), ('t', 30)), (('s', 5), ('t', 6))]
dictionaries_list = [{'a': 5, 's': 45, 't': 10}, {'s':5,'t':6}, {'a':2,'s':22,'t':30}]

tuple_dict = {}
tuple_dict['s'] = [i[0][1] for i in tuple_list]
tuple_dict['t'] = [i[1][1] for i in tuple_list]
if some_parameter == 'something':
    # check for 's'
    m1_dicts = [d for d in dictionaries_list if d['s'] in tuple_dict['s']]
    # m1_dicts = [{'a': 5, 's': 45, 't': 10}, {'s':5,'t':6}]
else:
    # check for 't'
    m1_dicts = [d for d in dictionaries_list if d['t'] in tuple_dict['t']]
    # m1_dicts = [{'s':5,'t':6}, {'a':2,'s':22,'t':30}]

建议使用 some_parameter 作为键来检查,而不是 some_parameter = 'something'。
some_parameter = 's' # check for 's'
m1_dicts = [d for d in dictionaries_list if d[some_parameter] in tuple_dict[some_parameter]]

这将增加内存和CPU的消耗。您正在遍历整个字典列表,并将成员转换为集合和交集操作。此外,您没有考虑元组列表中的所有项。 - shrishinde
@ShriShinde,我已经修改了答案,考虑了元组列表中的所有项。 - Skycc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接