Python - удаление элемента из словаря, если ключ первого кортежа отсутствует в другом словаре - PullRequest
1 голос
/ 24 января 2020

У меня есть два словаря D1, D2. D1 содержит ключ, за которым следует значение. D2 содержит кортеж в качестве ключа, за которым следует значение.

D1 = {'x':123, 'x1': 154, 'x2':184}

D2 = {('x','x1'):50, ('x1','x2'):30, ('y','x2'):10}

Есть ли способ удалить элемент из D2, если первая часть ключа-кортежа не является ключом в D1? Таким образом, в этом примере элемент из D2, у которого 'y' является первым значением ключа кортежа, должен быть удален из словаря. Поэтому D2 будет выглядеть следующим образом.

D2 = {('x','x1'):50, ('x1','x2'):30}

Ответы [ 3 ]

1 голос
/ 24 января 2020

Сделайте копию D2, используя .copy(), и итерируйте по ней, чтобы избежать изменения оригинального слова и получения RuntimeError при выполнении .pop()

D1 = {'x':123, 'x1': 154, 'x2':184}
D2 = {('x','x1'):50, ('x1','x2'):30, ('y','x2'):10}

for i in D2.copy():
    if i[0] not in D1.keys():
        D2.pop(i)

D2 Становится:

{('x', 'x1'): 50, ('x1', 'x2'): 30}

1 голос
/ 24 января 2020

Вы можете попробовать перебрать D2.items ():

D1 = {'x':123, 'x1': 154, 'x2':184}
D2 = {('x','x1'):50, ('x1','x2'):30, ('y','x2'):10}
new_dict = {i:j for i,j in D2.items() if i[0] in D1}
print(new_dict)

Вывод

{('x', 'x1'): 50, ('x1', 'x2'): 30}
0 голосов
/ 24 января 2020

Простая функция для этого:

D1 = {'x':123, 'x1': 154, 'x2':184}

D2 = {('x','x1'):50, ('x1','x2'):30, ('y','x2'):10}

def remove_keys(d1, d2):
    keys_list = d1.keys()
    keys_to_remove = []
    for k1, k2 in d2.keys():
        if k1 not in keys_list:
            keys_to_remove.append((k1, k2))
    for key in keys_to_remove:
        del d2[key]
    return d2


D2 = remove_keys(D1, D2)
...