Допустим, у нас есть два вложенных списка: L1 = [[0, 1], [0, 2]]
и L2 = [[1, 2], [1, 3]]
Вопрос в том, существует ли биекция между целыми числами в одном списке и целыми числами в другом списке, которая преобразует L1
в L2
?Для L1
и L2
, указанных выше, ответ - да.
BIJECTION:
- старый
0
становится новым 1
- старый
1
становится новым 2
- старый
2
становится новым 3
Напомним наш вложенный список L1 = [[0, 1], [0, 2]]
.Если мы применим отображение, описанное выше, то получим L2 = [[1, 2], [1, 3]]
. Поэтому foo(L1, L2)
должно вернуть True
.foo
- это имя оператора равенства, который мы пытаемся реализовать.
Кроме того, порядок не имеет значения.Каждый список должен рассматриваться как математический «набор».
Ниже приведены некоторые примеры:
Левый список: [[2, 1], [3, 1]]
Правый список: [[1, 2], [1, 3]]
: True foo(left,right)
возвращает True
почему?
порядок не имеет значения
Левый список: [[2, 1], [3, 1]]
Правый список: [[1, 2], [3, 4]]
foo(left,right)
возвращает False
почему?
Два целых числа внутри левого списка одинаковы, но все целые числа внутри правого списка отличаются друг от друга.
left
= [[2, 1], [3, 1]]
right
= [[0, 1], [0, 1]]
foo(left, right)
возвращает False
почему?
правый список содержит только 2 различных целых числа (0
и 1
).Левый список содержит 3 различных целых числа (1
, 2
, 3
)
Некоторые более длинные примеры приведены ниже:
Исходный список: [[0, 1], [0, 2], [1, 2], [1, 3], [0, 1, 2]]
A1: [[4, 1], [4, 0], [1, 0], [1, 3], [4, 1, 0]]
: True
A2: [[4, 1], [4, 0], [1, 3], [1, 0], [4, 0, 1]]
: True
B: [[1, 2], [3, 1], [2, 4], [1, 4], [2, 4, 1]]
: True
C: [[3, 2], [5, 2], [5, 0], [0, 2], [5, 0, 2]]
: True
D: [[5, 2], [5, 2], [3, 0], [0, 2], [5, 0, 2]]
: False
E: [[3, 0], [0, 3], [5, 0], [0, 2], [5, 0, 2]]
: False
Bijection для примера A1
:
ORIGINAL A
0 4
1 1
2 0
3 3
A2
простоизменение порядка A1
В примере B 2 и 4 играют ту же роль, что и 0 и 2 в исходном списке.1 играет одинаковую роль в обоих списках, как и 3.
В примере C 0 и 5 играют ту же роль, что и 0 и 2 в исходном списке, 2 играет ту же роль, что и 1 висходный список, и 3 играет одинаковую роль в обоих списках.В примере D есть два одинаковых подсписка ([5, 2]), в то время как исходный список не имеет повторяющихся подсписков.В примере E 0 во всех четырех подсписках длины-2, в то время как в исходном списке нет ни одного числа во всех четырех подсписках длины 2.
Вот код, который я получил от моей попыткиоднако он не работает, когда заменяется небольшое число (например, 0) на одно из самых больших чисел в списках (например, 4).Когда он выполняет сортировку, он не может распознать, что 4 играет ту же роль, что и 0. Поскольку младшие числа можно заменить на большие, сортировка не будет работать.
def CheckUnique(configs, newconfig):
sortednewconfig = sorted([sorted(i) for i in newconfig])
presentnumbers = []
canonicalnewconfig = []
for sub in sortednewconfig:
for i in sub:
if i not in presentnumbers:
presentnumbers.append(i)
for sub in sortednewconfig:
cansub = []
for i in sub:
cansub.append(presentnumbers.index(i))
canonicalnewconfig.append(cansub)
if canonicalnewconfig not in configs:
return True
else:
return False