Как сравнить два словаря и отобразить значения, которые отличаются в шаблоне?

Я пытаюсь сравнить два словаря и если по ключу, значение отличается от другого словаря, то вывести разницу ключ, значение красным цветом.

Я думаю, что мой views.py правильный. Но как показать разницу в шаблоне?

У меня есть файл views.py:

def data_compare():
    fruits = {
        "appel": 3962.00,
        "waspeen": 3304.07,
        "ananas": 24,
    }
    set1 = set([(k, v) for k, v in fruits.items()])
    return set1


def data_compare2():

    fruits2 = {
        "appel": 3962.00,
        "waspeen": 3304.07,
        "ananas": 30,
    }

    set2 = set([(k, v) for k, v in fruits2.items()])
    return set2


def data_combined(request):
    data1 = data_compare()
    data2 = data_compare2()

   diff_set = list(data1 - data2) + list(data2 - data1)

    return render(request, "main/data_compare.html", context={"diff_set": diff_set})

и шаблон:

<!DOCTYPE html>
<html lang="en">

    <head>
        <meta charset="UTF-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Document</title>
    </head>

    <body>

        <div class="container center">
            {% for key, value in diff_set.set1.items %}
            <span style="color: red;">{{ key }}: {{value}}</span><br>
            {% endfor %}
        </div>

        <div class="container center">
            {% for key, value in diff_set.set2.items %}
            <span style="color: red;">{{ key }}: {{value}}</span><br>
            {% endfor %}
        </div>

    </body>

</html>

Я сделал print(diff_set) и это показывает:

[('ananas', 24), ('ananas', 30)]

так что это правильно

Но ничего не возвращается.

Вопрос: как вернуть ключ, значение из словаря, который отличается от другого словаря красным цветом?

Looks dictdiff может быть полезен в вашем случае. Следующий пример не совпадает с вашим результатом, но я надеюсь, что он будет полезен.

import dictdiffer

fruits = {
    "appel": 3962.00,
    "waspeen": 3304.07,
    "ananas": 24,
}
fruits2 = {
    "appel": 3962.00,
    "waspeen": 3304.07,
    "ananas": 30,
}

diff = list(dictdiffer.diff(first=fruits, second=fruits2))
print(diff)  # [('change', 'ananas', (24, 30))]

Следуя тому же принципу, что и мой последний ответ. Поскольку вы пытаетесь сравнить два словаря с одинаковыми ключами, вы можете просто просмотреть оба словаря сразу, сравнить значения и, если они отличаются, добавить ключ в список условий:

def compare_data(request):
    fruits = {"appel": 3962.00,"waspeen": 3304.07,"ananas": 24,}
    fruits2 = {"appel": 3962.00,"waspeen": 3304.07,"ananas": 30,}
    diff_set = []

    for k, v in fruits.items():
        if fruits[k] != fruits2[k]:
            diff_set.append(k)

    context = {
        'fruits': fruits,        
        'fruits2': fruits2,        
        'diff_set': diff_set,        
    }
    return render(request, 'main/data_compare.html', context)

template.html:

{% extends 'base.html' %}

{% block content %}
    <div class="container center">
        {% for key, value in fruits.items %}
            <span {% if key in diff_set %} style="color: red;" {% endif %}>{{ key }}: {{value}}</span><br>
        {% endfor %}
    </div>

    <div class="container center">
        {% for key, value in fruits2.items %}
            <span {% if key in diff_set %} style="color: red;"{% endif %}>{{ key }}: {{value}}</span><br>
        {% endfor %}
    </div>
{% endblock %}

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

В вашем случае все отображается красным цветом из-за оператора IF:

{% if diff_set %}...{% endif %}

Проверяет, содержит ли переменная 'diff_set' какие-либо значения. Есть, поэтому она возвращает True каждую итерацию.

Для того чтобы использовать вашу структуру 'diff_set': [('ananas', 24), ('ananas', 30)]

Нужно пройтись по списку и проверить, равно ли первое значение кортежа значению ключа. Даже если вы это сделаете, при текущей структуре это дважды выведет 'ananas' красным цветом.

Вернуться на верх