Нахождение разницы между ключами и значениями в одном словаре - PullRequest
1 голос
/ 04 апреля 2020

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

Это мой вывод при печати моего словаря, d1:

d1= {"A": ["J"], "B": ["A"], "C": ["A", "D", "J"], "D": ["A", "J"]}

Из приведенного выше кода клавиши «B» и «C» будут двумя клавишами, которые не отображаются в значениях, и я хотел бы иметь возможность их распечатать в списке.

Это мой код:

keysNotInValues = []
d1_keys = (d1.keys())

for key in d1_keys:
    flag = True
    for keys,values in d1.items():
        if key in values:
            flag == False

    if flag == True:
        keysNotInValues.append(key)

print(keysNotInValues)

Мой вывод, который я получил, это просто список всех ключей.

['A', 'B', 'C', 'D']

Я желая вывода:

['B', 'C']

Ответы [ 2 ]

2 голосов
/ 04 апреля 2020

Вы можете использовать наборы, чтобы определить разницу между 2 коллекциями

keys = set(d1)
values = set(item for sublist in d1.values() for item in sublist)
print(keys - values)  # {'C', 'B'}
0 голосов
/ 04 апреля 2020

Я думаю, что природа вашей проблемы в том, что вы сбрасываете flag=True при каждой итерации l oop. При такой структуре кода вы не найдете «ключей, которые ни в одном из значений», вместо этого вы найдете «ключи, которые отсутствуют хотя бы в одном из значений». Поскольку каждая клавиша отсутствует хотя бы в одном из значений, ваша функция возвращает все клавиши.

Один из способов сделать это - использовать встроенный в Python объект set(), используя set arithmeti c встроенные методы:

d1 = {"A": ["J"], "B": ["A"], "C": ["A", "D", "J"], "D": ["A", "J"]}

set_of_keys = set(d1.keys())

set_of_values = set()
for vals in d1.values():
    set_of_values.update(vals)

print(set_of_keys)
print(set_of_values)

values_that_arent_keys = set_of_values - set_of_keys
print(values_that_arent_keys)

keys_that_arent_values = set_of_keys - set_of_values
print(keys_that_arent_values)

Дает:

{'D', 'C', 'B', 'A'}
{'J', 'D', 'A'}
{'J'}
{'C', 'B'}

Вы можете использовать sorted(), если хотите, чтобы ваши наборы печатались в алфавитном порядке.

...