Сравнить список списка со словарем - PullRequest
0 голосов
/ 03 августа 2020

Мой список:

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, а другой список содержит values, которые находятся в main_dict, но не в candidate_values_exists_in_dict_key.

Вот то, что я пробовал, очень беспорядочно и медленно. Может у кого-нибудь есть более быстрый способ? Кроме того, как я могу иметь оператор else, который имеет список ключей v, которые не существуют в candidate_values_exists_in_dict_key, но в main_dict?

Гарантируется, что значения candidates всегда будут в клавишах main_dict и в том же порядке появления, что и candidates.

candidate_values_exists_in_dict_key = []

values_of_main_dict_not_in_candidates_values_list=[] 

for x in candidates:
    for k, v in main_dict.items():
        if x == list(k):
            candidate_values_exists_in_dict_key.append(v)

Ответы [ 2 ]

1 голос
/ 03 августа 2020

Подойдет обычное понимание списка с поиском по словарю. Нет необходимости во вложенных циклах

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]

0 голосов
/ 03 августа 2020

Учитывая, что вы хотите вывести список значений, которые не в кандидатах в дополнение к списку тех, которые есть, вам придется перебирать словарь в той или иной форме в любом случае.

Следовательно, код в вопросе в основном в порядке. Но вы можете немного улучшить его, используя набор кандидатов (преобразованных в кортежи, используемые в качестве ключей словаря) для проверки включения, вместо того, чтобы иметь вложенные циклы. Поскольку вы знаете, что они используются в качестве ключей словаря, вы также знаете, что они могут использоваться как элементы набора.

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...