Arhn - архитектура программирования

Словарь фильтров для значений, которых нет в другом словаре

Даны два словаря mydict1 и mydict2. Пары ключ-значение в mydict2 должны быть удалены, если значения уже содержатся в mydict1, независимо от ключа и порядка значений.

Код ниже обеспечивает правильный вывод mydict2 = {'key6': [2,1,4], 'key4': [2]}. Однако он будет использоваться как часть более крупного кода. Есть ли лучший, то есть более фитонический способ написать его, чтобы сделать его более компактным и эффективным без необходимости использования функций?

mydict1 = {'key1':[1],'key2':[1,2],'key3':[1,2,3]}
mydict2 = {'key4':[2],'key5':[2,1],'key6':[2,1,4]}
mydict3 = {}

for md2 in mydict2:
    isindict = False
    for md1 in mydict1:
        isindict = isindict|(sorted(mydict1[md1])==sorted(mydict2[md2]))
    if not isindict:
        mydict3[md2] = mydict2[md2]
mydict2 = mydict3

Решения для удаления элементов из списка, < href="https://stackoverflow.com/questions/1911273/is-there-a-better-way-to-compare-dictionary-values">сравнение словарей и условная фильтрация словаря не может быть передана прямым способом.

01.11.2019

Ответы:


1

Используйте понимание списка и понимание dict, чтобы отсортировать все значения mydict2, затем проверьте, есть ли там отсортированное значение mydict1:

mydict1 = {'key1':[1],'key2':[1,2],'key3':[1,2,3]}
mydict2 = {'key4':[2],'key5':[2,1],'key6':[2,1,4]}

vals = [tuple(sorted(x)) for x in mydict1.values()]
mydict2 = {k:v for (k,v) in mydict2.items() if tuple(sorted(v)) not in vals}

print(mydict2)

Или, в одной строке:

mydict1 = {'key1':[1],'key2':[1,2],'key3':[1,2,3]}
mydict2 = {'key4':[2],'key5':[2,1],'key6':[2,1,4]}

mydict2 = {k:v for (k,v) in mydict2.items() 
        if tuple(sorted(v)) not in [tuple(sorted(x)) for x in mydict1.values()]}

print(mydict2)
01.11.2019
  • Вы создаете один и тот же список кортежей для каждой пары ключ/значение в mydict1 01.11.2019
  • @PeterWood Если вы хотите запомнить список кортежей, используйте версию с дополнительной строкой vals=... 01.11.2019
  • @PeterWood Думаю, я не уверен, к чему вы клоните, потому что мой ответ создает только один список кортежей в первом примере кода, а не список для каждой пары ключ / значение. 01.11.2019

  • 2

    Вы можете использовать понимание dict :

    mydict1 = {'key1':[1],'key2':[1,2],'key3':[1,2,3]}
    mydict2 = {'key4':[2],'key5':[2,1],'key6':[2,1,4]}
    
    results = {key : value for (key,value) in mydict2.items() 
               if set(value) not in [ set(val) for val in mydict1.values()]}
    print(results)
    

    {'ключ4': [2], 'ключ6': [2, 1, 4]}

    Редактировать1

    Не работает с таким дубликатом:

    mydict1 = {'key1':[1],'key2':[1,2],'key3':[1,2,3], 'key4' : [1, 1, 2]}
    mydict2 = {'key4':[2],'key5':[2,1],'key6':[2,1,4], 'key7' : [2, 2, 1]}
    

    Редактировать 2

    Следующие комментарии @Ruzihm awsers и @Peter Wood:

    mydict3 = {k:v for (k,v) in mydict1.items() 
            if tuple(sorted(v)) not in set(tuple(sorted(x)) for x in mydict2.values())}
    

    Это отвечает на вопрос OP и избегает многократного создания одного и того же кортежа значения, упомянутого @Peter Wood.

    01.11.2019
  • Что делать, если порядок элементов в value другой? 01.11.2019
  • Ошибка с [1, 1, 2], [2, 2, 1] 01.11.2019

  • 3

    я думаю, что это сработает:

    mydict1 = {'key1':[1],'key2':[1,2],'key3':[1,2,3]}
    mydict2 = {'key3':[2],'key5':[2,1],'key6':[2,1,4]}
    
    def merge_two_dicts(x, y):
        z = x.copy()
        z.update(y) 
        return z
    
    result = merge_two_dicts(mydict1, mydict2)
    print(result)
    
    01.11.2019
    Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..