我创建了一个Python类,其中包含一些字符串/数字属性和一个列表属性。现在我需要一个这个类的一些对象的列表,没有重复。对象可以具有相同的值(相等),但不应该存在多个对象。
我知道set只支持不可变对象,但我的对象的值会改变。
此问题是否有其他合适的数据类型?从技术上讲,我需要一个没有重复项的对象引用数组,它们实现了所有的集合类方法。
答案 0 :(得分:0)
我会推荐一个for循环,例如:
unique = []
for item in yourList:
if not item in unique:
unique.append(item)
但至于内置类型,set和dicts不能像你刚才提到的那样对这些类进行哈希。
答案 1 :(得分:0)
如果我正确理解你的问题,你就有一个带有等于运算符的可变类,它检查一些可变属性以确定两个实例是否相等。您希望构建这些实例的列表,仅排除对同一实例的重复引用,而不是等值实例。
您可以通过保留到目前为止所包含的set
个值的id
来执行此操作:
# 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
的返回值就可以正常工作了。如果您需要的值与首次出现在原始列表中的顺序相同,则可以使用OrderedDict
。
答案 2 :(得分:0)
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