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
我创建了一个 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