В каком-то контексте я пытаюсь перечислить число уникальных ситуаций, которые могут возникнуть при вычислении Banzhaf power indices для четырех игроков, когда нет диктатора, и есть четыре или пять коалиций.Проверьте, являются ли два вложенных списка эквивалентными при подстановке
Я использую следующий код для создания набора списков, которые я хочу перебрать.
from itertools import chain, combinations
def powerset(iterable):
s = list(iterable)
return chain.from_iterable(map(list, combinations(s, r)) for r in range(2, len(s)+1))
def superpowerset(iterable):
s = powerset(iterable)
return chain.from_iterable(map(list, combinations(s, r)) for r in range(4, 6))
set_of_lists = superpowerset([1,2,3,4])
Однако два списка в этом наборе не должны считаться уникальными, если они эквивалентны при переназначении.
Используя следующий список в качестве примера:
[[1, 2], [1, 3], [2, 3], [1, 2, 4]]
Если каждый элемент 2
переименовывается в 3
и наоборот, мы получим:
[[1, 3], [1, 2], [3, 2], [1, 3, 4]]
порядок, в каждом подсписком не имеет значения, а порядок подписок также не важен. Таким образом, места список может быть переписан как:
[[1, 2], [1, 3], [2, 3], [1, 3, 4]]
Есть 4 значения, так что есть P (4,4) = 24 возможных remappings, которые могут возникнуть (в том числе тривиального отображения).
Есть ли способ проверить это легко? Или, что еще лучше, есть ли способ избежать создания этих списков?
Я даже не уверен, как бы я преобразовал первый список во второй список (но мог бы грубо заставить его оттуда). Кроме того, я не ограничен типом данных (в определенной степени), и использование frozenset
будет в порядке.
Редактировать: Решение, предлагаемое tobias_k, отвечает на вопрос «проверка», но, как отмечается в комментариях, я думаю, что у меня неправильный подход к этой проблеме.
Я думаю, вы могли бы попытаться найти «нормализованную» форму для каждого набора, а затем поместить все это в набор. Конечно, сложный бит делает нормированную форму уникальной. Вы могли бы, например. сортировать числа в наборе и делать наиболее частое число 1, следующие 2 и т. д. и использовать некоторые аналогичные показатели для разрыва связей. –
Что такое желаемые списки? Это победившие коалиции или что? –
Вы должны использовать объекты 'set' вместо объектов' list', если вы хотите сравнивать списки независимо от порядка. Также возможно иметь набор множеств. – spiffman