将列表与字典进行比较

时间:2020-08-03 16:31:19

标签: python list dictionary

我的列表列表是

candidates= [[714, 1023, 768, 1078], [803, 938, 868, 995]]

我的字典是:

main_dict = {(1561, 48, 1623, 105): [[[1592, 58]],
                                     [[1591, 59]],
                                     [[1585, 59]],
                                     [[1600, 58]]],

             (714, 1023, 768, 1078): [[[1, 5]],
                                      [[2, 6]],
                                      [[3, 3]],
                                      [[4, 3]]],

             (803, 938, 868, 995): [[[14, 5]],
                                    [[22, 64]],
                                    [[34, 31]],
                                    [[43, 32]]]

             }

我想有2个列表,candidate_values_exists_in_dict_key包含values中存在的candidates的相应main_dict,另一个列表包含{{1} }位于values中,但不在main_dict中。

这是我尝试过的,非常混乱且缓慢。有人可以有更快的方法吗?此外,我怎么能有一个else语句,它包含键candidate_values_exists_in_dict_key的列表,它们不在v中但是在candidate_values_exists_in_dict_key中?

保证main_dict的值始终位于candidates键中,并且外观与main_dict相同。

candidates

2 个答案:

答案 0 :(得分:1)

只需使用dict查找进行普通列表理解就可以了。不需要嵌套循环

candidate_values_exists_in_dict_key = [main_dict[tuple(c)] for c in candidates]

values_of_main_dict_not_in_candidates_values_list = [v for k,v in main_dict.items() if list(k) not in candidates]

答案 1 :(得分:0)

鉴于您除了要输出候选列表中的 not 值列表外,还必须以一种形式遍历字典或在任何情况下都可以。

因此,问题中的代码基本上没问题。但是您可以通过使用一组候选对象(转换为用作字典键的元组)来测试包含性,而不是使用嵌套循环来稍微改善它。因为您知道它们被用作字典键,所以您也知道它们可以用作集合的元素。

candidate_tuples = set(map(tuple, candidates))

candidate_values_exists_in_dict_key = []
values_of_main_dict_not_in_candidates_values_list = [] 

for k, v in main_dict.items():
    if k in candidate_tuples:
        candidate_values_exists_in_dict_key.append(v)
    else:
        values_of_main_dict_not_in_candidates_values_list.append(v)