假设我们有两个嵌套列表:L1 = [[0, 1], [0, 2]]
和 L2 = [[1, 2], [1, 3 ]]
问题是,一个列表中的整数与另一个列表中的整数之间是否存在将 L1
转换为 L2
的双射?对于上面给出的L1
和L2
来说,答案是肯定的。
双射:
- 旧的
0
变成新的1
- 旧的
1
变成新的2
- 旧的
2
变成新的3
回想一下我们的嵌套列表L1 = [[0, 1], [0, 2]]
。如果我们应用上述映射,那么我们会得到 L2 = [[1, 2], [1, 3]]
因此,foo(L1, L2)
应该返回正确
。 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
为什么?
左侧列表中的两个整数相同,但右侧列表中的所有整数彼此不同。
左
= [[2, 1], [3, 1]]
右
= [[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]]
:真
D: [[5, 2], [5, 2], [3, 0], [0, 2], [5, 0, 2]]
:假
E: [[3, 0], [0, 3], [5, 0], [0, 2], [5, 0, 2]]
:假
双射示例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中,所有四个长度为2的子列表中都有0,而在原始列表中,所有四个长度为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
最佳答案
将 all
和 any
与 zip
一起使用:
>>> l = [[0, 1], [0, 2], [1, 2], [1, 3], [0, 1, 2]]
>>> l2 = [[4, 1], [4, 0], [1, 3], [1, 0], [4, 0, 1]]
>>> all([any(i in x for i in y) for x, y in zip(l, l2)])
True
>>> l3 = [[5, 2], [5, 2], [3, 0], [0, 2], [5, 0, 2]]
>>> all([any(i in x for i in y) for x, y in zip(l, l3)])
False
>>>
关于python - 如何确定嵌套列表结构是否与另一个相同,但元素交换为新的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56387815/