从列表中删除重复的等价 类

Removing duplicate equivalence classes from a list

我正在寻找一种获取元素列表的方法,其中一些可能是 "equivalent",而 return 是一个没有等效元素的列表。我的粗略尝试是这样的:

unique = []
for item1 in mylist:
    include = 1
    for item2 in unique:
      if are_these_equivalent(item1, item2):
        include = 0
        break        #no need to examine anymore items
    if include == 1:
      unique.append(item1)

我猜算法上没什么可做的,但感觉代码有点乱。有什么好的方法可以美化它吗?

编辑: 我使用的等价是两个排列是否在 S_n 中共轭,但是任何等价的抽象(在 equivalence classes 的意义上)应该工作相同。

您可以使用集合轻松删除任何重复项。

unique = list(set(unique))

set(unique) 将创建一个集合,根据定义,该集合不能包含任何重复。调用 list() 会将返回的集合变回列表。这不是必需的,取决于您之后打算用它做什么。

根据评论中的内容,这里是代码的改进和更正版本。它只比您的原始代码好一点。

unique = []
for item1 in mylist:
  for item2 in unique:
    if are_these_equivalent(item1, item2):
      break
  else:
    unique.append(item1)

在我看来,您可能正在寻找 "Set"?

也许是这样的?

my_list = [1,2,3,4,5,2,3,5,6,
           'apples', 'apples', 'oranges', 'bananas', 'oranges']

unique = [i for i in set(my_list)]
print unique

差不多,当你使用set()时,你可以给它传递一个可迭代对象(一个列表) 它只会包含一次值。如果他们再次出现在列表中,他们将被忽略。