Попытка получить уникальный список значений из словаря

У меня есть словарь, который имеет структуру, подобную:

{
    'id': 16, 
    'name': 'something', 
    'client': 'client1', 
}, 
{
    'id': 17, 
    'name': 'something', 
    'client': 'client2', 
},
{
    'id': 18, 
    'name': 'something-else', 
    'client': 'client3', 
}

Я могу перебирать свои словари в своих шаблонах, но в этом случае я пытаюсь получить уникальные значения name. Я попробовал пару разных вариантов, таких как:

{% for name in data | unique %}

или

{% for name in data.name | unique %}

но ничто из этого не возвращает мне список уникальных имен.

Как лучше всего это сделать? Я думал о создании собственного фильтра, но мне интересно, есть ли лучший способ сделать это.

У меня есть словарь. Похоже, у вас действительно есть список словарей, но он неясен, поскольку ваш пример неполон.

John Gordon 20.06.2024 02:55

Добавьте минимально воспроизводимый пример, чтобы другие могли более точно определить источник вашей ошибки.

Andrew Yim 20.06.2024 03:25
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
2
72
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Из документации:

Возвращает список уникальных элементов из заданной итерации.

case_sensitive – Рассматривайте строки верхнего и нижнего регистра как отдельные.

attribute – Фильтровать объекты с уникальными значениями этого атрибута.

Поскольку вы хотите исключить дубликаты на основе значения аргумента name, вам следует установить аргумент attribute соответствующим образом:

{% for name in data | unique(attribute = "name") %}

Я предполагаю, что data — это list, содержащий множество словарей, в том числе и три вышеперечисленных. Следующее будет работать, если вы хотите, чтобы значение ключа «имя» было уникальным.

У меня мало знаний в dict, так как большую часть вещей я делаю в самом flask. Почему бы нам не поступить таким образом, который дает аналогичный результат?

файл Python (колба):

from flask import Flask, render_template, request
app = Flask(__name__)

data = [{
            'id': 16, 
            'name': 'something', 
            'client': 'client1', 
        }, 

      {
            'id': 17, 
            'name': 'something', 
            'client': 'client2', 
        },
      {
            'id': 18, 
            'name': 'something-else', 
        'client': 'client3', 
      },
      {
            'id': 19, 
            'name': 'One more', 
        'client': 'client4', 
      }
      ]
      
result = []
for i, x in enumerate(data):
    sub = data[:i] + data[i+1:]    
    ls = [y['name'] for y in sub]
    if x['name'] not in ls: result.append(x)


      
@app.route('/')
def provide_dict():
    if request.method == 'GET':
        return render_template('index.html', data = result)
      
if __name__ == '__main__': app.run()   

    

ДЖИНДЖА2:

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

        <table>
            {% for x in data %}     
                
                {% for key, value in x.items() %}
                            <tr>
                                <th> {{ key }} </th>
                                <td> {{ value }} </td>
                            </tr>
                {% endfor %}
                    
            {% endfor %}
        </table>
        <br>
    </body>
</html>

Выход:

Вопрос был в том, как это сделать в шаблоне jinja, а не в обычном коде Python.

John Gordon 20.06.2024 04:19

@JohnGordon, теперь я понял и дал другое решение.

Suramuthu R 20.06.2024 05:36

@JohnGordon, когда я опубликовал сообщение 11 часов назад, произошла ошибка. Поэтому удалил. Сейчас исправил ошибку, протестировал и перепостил. Проверьте мой отредактированный ответ.

Suramuthu R 20.06.2024 15:56

@SuramuthuR Думаю, лучший вопрос, который поможет мне учиться, будет: зачем мне это делать? Я имею в виду, что фильтр jinja встроен, понятен, прост и позволяет будущим сопровождающим этого кода понять, что он делает. Поскольку данные уже используются в шаблоне другими способами, вы также предлагаете отправить совершенно новый частично дублированный набор данных. Помогите мне понять, почему этот подход лучше?

supergper 21.06.2024 18:23

@supergper, это просто потому, что я могу использовать только те ресурсы, которые уже изучил. Мне не нужно полностью изучать синтаксис шаблона jinja2, зная Python и Flask. (На самом деле я знаю лишь немного логики шаблонов jinja2. Остальное я мог бы сделать с помощью Python)

Suramuthu R 22.06.2024 10:52

Другие вопросы по теме