从列表中有效删除重复项和类似元素

时间:2019-09-12 17:29:40

标签: python time-complexity

我有一个包含等长序列的List(在此示例中,序列的长度为2,但可以比其他情况下的长度更长),例如:

[[3, 2], [0, 6], [6, 0], [7, 7], [0, 5], [7, 7]]

现在,我要删除所有重复项([7, 7]出现两次),还要删除所有反向重复项([0, 6][6, 0])。

我当前的代码是这样:

def getUniqueShapes(shapes):
    unique = []
    for shape in shapes:
        if shape not in unique and reversed(shape) not in unique:
            shapes.append(shape)

    print(unique)

此示例的预期输出为

[[3, 2], [0, 6], [7, 7], [0, 5]]

由于not in,该算法的运行速度非常差。 有没有一种简单的方法可以将这样的条件应用于具有更好时间复杂度的列表?

1 个答案:

答案 0 :(得分:4)

  • 假设在[1, 0]的情况下,[0, 1]的含义相同。
  • 您需要先将列表转换为元组,因为list不可散列。
  • 输出也是元组的集合,您可以轻松地将其转换为列表列表。
>>> l = [[1, 2], [2, 1], [3, 4], [5, 6], [5, 6]]
>>> set(map(tuple, map(sorted, l)))
{(1, 2), (3, 4), (5, 6)}

编辑:这将适用于任何长度的case元素。