Как бросить AssertionError для повторяющихся значений в списке OrderedDict в python - PullRequest
0 голосов
/ 11 мая 2018

У меня есть список OrderedDict. OrderedDict - это кортеж пары ключ / значение:

dict_lists = [[OrderedDict([('name', 'Good check'), ('url',
              'https://www.facebook.com/'), ('lag', 10), ('tags',
              ['team:team 4', 'section 1', 'section 2']), ('headers',
              OrderedDict([('Location', 'http://facebook.com/')]))]),
              OrderedDict([('name', 'Bad check'), ('url',
              'https://www.google.com/'), ('lag', 5), ('tags',
              ['team:team 1'])]), OrderedDict([('name', 'Bad check'),
              ('url', 'https://www.microsoft.com/'), ('lag', 5), ('tags'
              , ['team:team 5'])])]]

Я пытаюсь выдать ошибку AssertionError, когда для клавиши "name" есть повторяющиеся значения.

В настоящее время он работает для ключей, потому что я считаю, что он генерирует ошибку AssertionError для дублированных ключей:

AssertionError: 'name' неожиданно найдено в ['name', 'url', 'lag', 'tags', 'headers']

Код для дубликатов ключей:

import unittest
from collections import OrderedDict
    keys = []
            for dict_list in dict_lists:
                for dictionary in dict_list:
                    dict_keys = dictionary.keys()
                    for key in dict_keys:
                        self.assertNotIn(key, keys)
                        keys.append(key)

Как заставить его работать для дублирующихся значений (только для клавиши "name")

1 Ответ

0 голосов
/ 11 мая 2018

Сохраните значения для этого ключа в наборе, а затем протестируйте его на этом наборе:

name_values = {}
for dict_list in dict_lists:
    for dictionary in dict_list:
        if 'name' in dictionary:
            value = dictionary['name']
            self.assertNotIn(value, name_values)
            name_values.add(value)

Вы также должны использовать набор для своих ключей.Также нет необходимости вызывать метод keys(), цикл по словарю напрямую дает вам также ключи.

Если вы хотите объединить циклы вместе, вы можете просто проверить, равен ли текущий ключ'name':

keys = {}
name_values = {}

for dict_list in dict_lists:
    for dictionary in dict_list:
        for key in dictionary:
            self.assertNotIn(key, keys)
            keys.add(key)
            if key == 'name':
                value = dictionary[key]
                self.assertNotIn(value, name_values)
                name_values.add(value)

Обратите внимание, что тот факт, что ваши словари упорядочены, не имеет значения для решения здесь.

...