回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>假设我们有两个嵌套列表:<code>L1 = [[0, 1], [0, 2]]</code>和<code>L2 = [[1, 2], [1, 3]]</code></p>
<p>问题是,一个列表中的整数和另一个列表中的整数之间是否存在一个双射,它将<code>L1</code>转换成<code>L2</code>?对于上面给出的<code>L1</code>和<code>L2</code>,答案是肯定的。你知道吗</p>
<p>双射:</p>
<ul>
<li>旧的<code>0</code>变成新的<code>1</code></li>
<li>旧的<code>1</code>变成新的<code>2</code></li>
<li>旧的<code>2</code>变成新的<code>3</code></li>
</ul>
<p>回想一下我们的嵌套列表<code>L1 = [[0, 1], [0, 2]]</code>。如果我们应用上面描述的映射,那么我们得到<code>L2 = [[1, 2], [1, 3]]</code>,因此<code>foo(L1, L2)</code>应该返回<code>True</code>。<code>foo</code>是我们试图实现的相等运算符的名称。你知道吗</p>
<p>而且,秩序也不重要。每个列表都应视为一个数学“集合”</p>
<p>示例如下:</p>
<p>左列表:<code>[[2, 1], [3, 1]]</code><br/>
右列表:<code>[[1, 2], [1, 3]]</code>:真
<code>foo(left,right)</code>返回<code>True</code><br/>
<strong>为什么?</strong><br/>
顺序不重要</p>
<p>左列表:<code>[[2, 1], [3, 1]]</code><br/>
右列表:<code>[[1, 2], [3, 4]]</code><br/>
<code>foo(left,right)</code>返回<code>False</code><br/>
<strong>为什么?</strong><br/>
左侧列表中的两个整数相同,但右侧列表中的所有整数彼此不同。你知道吗</p>
<p><code>left</code>=<code>[[2, 1], [3, 1]]</code><br/>
<code>right</code>=<code>[[0, 1], [0, 1]]</code><br/>
<code>foo(left, right)</code>返回<code>False</code><br/>
<strong>为什么?</strong><br/>
右边的列表只包含2个不同的整数(<code>0</code>和<code>1</code>)。左边的列表包含3个不同的整数(<code>1</code>,<code>2</code>,<code>3</code>)</p>
<p>下面是一些较长的示例:</p>
<p>原始列表:<code>[[0, 1], [0, 2], [1, 2], [1, 3], [0, 1, 2]]</code></p>
<p>A1:<code>[[4, 1], [4, 0], [1, 0], [1, 3], [4, 1, 0]]</code>:正确</p>
<p>A2:<code>[[4, 1], [4, 0], [1, 3], [1, 0], [4, 0, 1]]</code>:正确</p>
<p>B:<code>[[1, 2], [3, 1], [2, 4], [1, 4], [2, 4, 1]]</code>:正确</p>
<p>C:<code>[[3, 2], [5, 2], [5, 0], [0, 2], [5, 0, 2]]</code>:正确</p>
<p>D:<code>[[5, 2], [5, 2], [3, 0], [0, 2], [5, 0, 2]]</code>:错误</p>
<p>E:<code>[[3, 0], [0, 3], [5, 0], [0, 2], [5, 0, 2]]</code>:假</p>
<p>双射,例如<code>A1</code>:</p>
<pre><code>ORIGINAL A
0 4
1 1
2 0
3 3
</code></pre>
<p><code>A2</code>只是<code>A1</code>的重新排序</p>
<p>在示例B中,2和4与原始列表中的0和2扮演相同的角色。1和3在两个列表中的角色相同。你知道吗</p>
<p>在示例C中,0和5与原始列表中的0和2扮演相同的角色,2与原始列表中的1扮演相同的角色,3在两个列表中扮演相同的角色。
在示例D中,有两个相同的子列表([5,2]),而原始列表没有重复的子列表。
在示例E中,所有四个length-2子列表中都有0,而在原始列表中,所有四个length-2子列表中都没有数字。你知道吗</p>
<p>下面是我尝试的代码,但是当一个小的数字(比如0)被交换为列表中最大的数字之一(比如说4)时,它就不起作用了。进行排序时,它无法识别4与0扮演的角色相同。因为低的数字可以换成高的数字,所以排序将不起作用。你知道吗</p>
<pre class="lang-py prettyprint-override"><code>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
</code></pre>