python - 如何确定嵌套列表结构是否与另一个相同,但元素交换为新的

标签 python permutation

假设我们有两个嵌套列表:L1 = [[0, 1], [0, 2]]L2 = [[1, 2], [1, 3 ]]

问题是,一个列表中的整数与另一个列表中的整数之间是否存在将 L1 转换为 L2 的双射?对于上面给出的L1L2来说,答案是肯定的。

双射:

  • 旧的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 个不同的整数(01)。左侧列表包含 3 个不同的整数 (123)

下面显示了一些较长的示例:

原始列表:[[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

最佳答案

allanyzip 一起使用:

>>> 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/

相关文章:

Python - 循环读取RFID

python - Pytest - 重用为不同用户提供不同输出的固定装置

performance - 用 Lexigraphic 的重复计算排列

android - 如何在我的 Android 应用程序(如 SL4A)中集成 Python 脚本

python - Matplotlib.动画 : how to remove white margin

java - 如何从这个正则表达式生成所有可能的数字?

python - 置换算法分析

python - 在 Python 中搜索子字符串的字符排列

python - 所有排列的列表,但没有相反的数字

python - Pandas :将数据框中的日期更改为相同的日期格式