Для визуальной простоты я вставлю код, который считаю актуальным, если нужно что-то еще, пожалуйста, оставьте комментарий.
Допустим, у нас есть следующий словарь под названием «состояния»:
{0: ([[0, 0], [0, 0]], [1, 0]), 1: ([[0, 0], [0, 1]], [1, 0]), 2: ([[0, 0], [1, 0]], [1, 0]), 3: ([[0, 0], [1, 1]], [1, 0]), 4: ([[0, 1], [0, 0]], [1, 0]), 5: ([[0, 1], [0, 1]], [1, 0]), 6: ([[0, 1], [1, 0]], [1, 0]), 7: ([[0, 1], [1, 1]], [1, 0]), 8: ([[1, 0], [0, 0]], [1, 0]), 9: ([[1, 0], [0, 1]], [1, 0]), 10: ([[1, 0], [1, 0]], [1, 0]), 11: ([[1, 0], [1, 1]], [1, 0]), 12: ([[1, 1], [0, 0]], [1, 0]), 13: ([[1, 1], [0, 1]], [1, 0]), 14: ([[1, 1], [1, 0]], [1, 0]), 15: ([[1, 1], [1, 1]], [1, 0]), 16: ([[0, 0], [0, 0]], [0, 1]), 17: ([[0, 0], [0, 1]], [0, 1]), 18: ([[0, 0], [1, 0]], [0, 1]), 19: ([[0, 0], [1, 1]], [0, 1]), 20: ([[0, 1], [0, 0]], [0, 1]), 21: ([[0, 1], [0, 1]], [0, 1]), 22: ([[0, 1], [1, 0]], [0, 1]), 23: ([[0, 1], [1, 1]], [0, 1]), 24: ([[1, 0], [0, 0]], [0, 1]), 25: ([[1, 0], [0, 1]], [0, 1]), 26: ([[1, 0], [1, 0]], [0, 1]), 27: ([[1, 0], [1, 1]], [0, 1]), 28: ([[1, 1], [0, 0]], [0, 1]), 29: ([[1, 1], [0, 1]], [0, 1]), 30: ([[1, 1], [1, 0]], [0, 1]), 31: ([[1, 1], [1, 1]], [0, 1]), 32: ([[0, 0], [0, 1]], [-1, 0]), 33: ([[0, 0], [1, 0]], [-1, 0]), 34: ([[0, 0], [1, 1]], [-1, 0]), 35: ([[0, 1], [0, 0]], [-1, 0]), 36: ([[0, 1], [0, 1]], [-1, 0]), 37: ([[0, 1], [1, 0]], [-1, 0]), 38: ([[0, 1], [1, 1]], [-1, 0]), 39: ([[1, 0], [0, 0]], [-1, 0]), 40: ([[1, 0], [0, 1]], [-1, 0]), 41: ([[1, 0], [1, 0]], [-1, 0]), 42: ([[1, 0], [1, 1]], [-1, 0]), 43: ([[1, 1], [0, 0]], [-1, 0]), 44: ([[1, 1], [0, 1]], [-1, 0]), 45: ([[1, 1], [1, 0]], [-1, 0]), 46: ([[1, 1], [1, 1]], [-1, 0]), 47: ([[0, 0], [0, 1]], [0, -1]), 48: ([[0, 0], [1, 0]], [0, -1]), 49: ([[0, 0], [1, 1]], [0, -1]), 50: ([[0, 1], [0, 0]], [0, -1]), 51: ([[0, 1], [0, 1]], [0, -1]), 52: ([[0, 1], [1, 0]], [0, -1]), 53: ([[0, 1], [1, 1]], [0, -1]), 54: ([[1, 0], [0, 0]], [0, -1]), 55: ([[1, 0], [0, 1]], [0, -1]), 56: ([[1, 0], [1, 0]], [0, -1]), 57: ([[1, 0], [1, 1]], [0, -1]), 58: ([[1, 1], [0, 0]], [0, -1]), 59: ([[1, 1], [0, 1]], [0, -1]), 60: ([[1, 1], [1, 0]], [0, -1]), 61: ([[1, 1], [1, 1]], [0, -1])}
«состояния» зависят от трех переменных: (Примечание: значения следующих переменных генерируют приведенный выше словарь)
NUM_MECS = 2
MAX_MEC_CAPACITY = 2
VNF_TYPES = 2
Выберем значение из ключа 1:
([[0, 0], [0, 1]], [1, 0])
«NUM_MECS» определяет количество подсписков, которое будет иметь первый элемент кортежа (значение из ключа 1). Поскольку его значение равно 2, у нас есть два подсписка: [[0, 0], [0, 1]].
«MAX_MEC_CAPACITY» определяет диапазон для каждого значения в подсписках для первого элемента в кортеже. То есть любое из значений из [[0, 0], [0, 1]] может варьироваться от 0 до 1. Если мы изменим значение на 3, это будет означать, что каждое значение находится в диапазоне от 0 до 2 (например, [[2, 0], [1, 2]]).
'VNF_TYPES' будет определять размер для всех подсписков, а также для второго элемента в кортеже. Поскольку его значение равно 2, у нас есть только размер 2 во всех подсписках и списке из второго элемента в кортеже ([[размер 2], [размер 2]], [размер 2]).
Второй элемент кортежа, список, может содержать только два значения (1 или -1), и только один из его элементов может содержать его, в то время как остальные останутся со значением 0. Независимо от размера списка, только один из его элементов будет содержать либо 1, либо -1. где бы ни был 1 или -1, будет определять, в какой позиции из элементов подсписков будет затронут первый элемент в кортеже. Следовательно, если у нас есть:
([[0, 0], [0, 1]], [1, 0])
Означает, что единица может быть увеличена в любом из первых элементов подсписков, начиная с первого элемента в кортеже.
Здесь:
([[1, 0], [0, 1]], [1, 0])
или здесь:
([[0, 0], [1, 1]], [1, 0])
Аналогично, если у нас есть:
([[0, 1], [1, 1]], [-1, 0])
Означает, что мы можем вычесть единицу из любого из первых элементов подсписков, в данном конкретном случае будет вычитаться только из второго подсписка:
([[0, 1], [0, 1]], [-1, 0])
Как мы назначаем, к какому подсписку добавлять или вычитать не имеет отношения.
Давайте сосредоточимся только на тех значениях, где второй элемент кортежа будет содержать -1. Следуя ранее объясненным рекомендациям, мы можем согласиться с тем, что нет никакого смысла иметь значение, из которого мы ничего не можем вычесть, например:
([[0, 0], [0, 0]], [-1, 0])
Поэтому мы могли бы реализовать следующее, чтобы избавиться от всех возможных вариаций из последнего примера:
for key, state in states.values():
if ([[0]*VNF_TYPES]*NUM_MECS == state[0]) and (-1 in s[1]):
del states[key]
Это позволяет удалить только:
([[0, 0], [0, 0]], [-1, 0])
or
([[0, 0], [0, 0]], [0, -1])
ПОСТАНОВКА ЗАДАЧИ
Хотя приведенные выше значения были удалены из словаря, все еще есть некоторые значения, которые все еще не имеют смысла, поэтому я хочу их удалить, например:
([[0, 0], [0, 1]], [-1, 0]),
([[0, 0], [1, 0]], [0, -1]),
([[0, 1], [0, 0]], [-1, 0]),
([[1, 0], [0, 0]], [0, -1]),
([[0, 1], [0, 1]], [-1, 0]),
([[1, 0], [1, 0]], [0, -1]),
([[0, 1], [0, 1]], [-1, 0]),
Мой вопрос заключается в том, как можно пройти через все значения, а затем через все подсписки в первом списке каждого значения, чтобы сравнить значения с той же позицией индекса, что и -1 во втором элементе кортежа, чтобы удалить их? Какие-либо предложения?
Очевидно, что идея состоит в том, чтобы сделать это в общем виде, независимо от структуры словаря, поэтому, пожалуйста, не предлагайте никаких методов жесткого кодирования.