Python 不重复的可变对象列表

Python list of mutable objects without duplicates

我创建了一个 Python class,其中包含一些 string/number 属性和一个列表属性。现在我需要这个 class 的一些没有重复的对象的列表。对象可以具有相同的值(相等),但任何对象都不应出现超过一次。

我知道集合只支持不可变对象,但我的对象的值会改变。

是否有其他适合此问题的数据类型?从技术上讲,我需要一个没有重复项的对象引用数组,它实现了所有 collection-class 方法。

我会推荐这样的 for 循环:

unique = []
for item in yourList:
    if not item in unique:
        unique.append(item)

但是对于内置类型,集合和字典不能像你刚才提到的那样散列这些类。

如果我对你的问题的理解正确,你有一个可变 class 和一个相等运算符,检查它的一些可变属性以确定两个实例是否相等。您想要构建这些实例的列表,仅排除对同一实例的重复引用,而不是等值实例。

您可以通过保留 id 个您目前包含的值的 set 来做到这一点:

# given some pre-existing list of objects, initial_list

seen_ids = set()
deduped_list = []
for instance in initial_list:
    if id(instance) not in seen_ids:
        deduped_list.append(instance)
        seen_ids.add(id(instance))

如果您想在一个表达式上完成所有操作,您可以改用字典和生成器表达式:

deduped_list = list(dict((id(instance), instance) for instance in initial_list).values())

仅当您使用 Python 3 并且需要一个实际的列表对象时才需要调用 list。如果您只需要一些可迭代的东西,values 中的 return 值就可以正常工作。如果您需要值的顺序与它们首次出现在原始列表中的顺序相同,您可以使用 OrderedDict.

set() 完全如您所愿。直接用就可以了:

class Person(object):
    def __init__(self, height):
        self.height = height

Tom = Person(190)
George = Person(200)
Bob = Person(200)

friends = set([Tom, George, Bob])
assert len(friends) == 3