0

Python 有一个非常好的“集合”数据结构,它基本上是一个支持集合操作的无序列表。我很想将这样的数据结构用于以下目的:

我有一组来自调查的数据点(每个点都是一个二元素 Scipy/numpy 数组),可以根据受访者的性别和婚姻状况分为不同的子集。

不幸的是,Python 集合似乎不允许所谓的可变对象,例如 numpy arays 和 lists。我可以为我的数据点使用元组,但我想知道是否有更好的方法来做到这一点。

理想情况下,我希望有几个数据点的无序列表(集合),我可以相交、联合等。 - 我可以迭代它们(包括单个数据点,以及用于绘图目的的集合列表)。

所以我的问题是:使用元组集是在这种情况下做我想做的事情的唯一方法吗?在 Python 中真的不可能有一组可变元素(例如 numpy 数组)吗?

4

2 回答 2

1

python-sets在 python 中必须是可散列的。因此,您可以定义 aclass datapoint并实现__hash__(self)and__eq__(self)作为其元素的函数,并将这些元素的实例添加到您的集合中。

或者,也许您想使用命名元组。我没有测试过它们,但它们也实现__hash____eq__。它们仍然是元组,但至少可以以更易读的方式访问它们。

于 2012-11-18T16:15:10.277 回答
-1

可变对象集是一个复杂的概念。什么应该

a = set([]); 
a.add (object1);
a.add (object2);
object3 = object1;
object1 = object2;
object1 = object3;
print (len(a));

打印?你可以说当object1 和object2 相等时集合应该折叠起来,但这基本上是无法实现的。坚持print(len(a))在中间不应该改变 a--len 应该是一个纯函数--但这意味着set必须存储多个对象并在对它们进行操作时找出哪些是相同的。当然

print (len(a))
object1 = object3
print (len(a))

打印 1 2 也有点令人惊讶。在可变对象上高效地并以合理的语义实现集合非常困难,这就是 Python 没有尝试的原因。

编辑:然后尝试

a = set([])
a.add (mutable_array([1,2]));
a.add (mutable_array([1,3]));
for i in a:
     i[1] = 2
print (len(a));

重点是:如果你将一个可变对象粘贴到一个集合中,要么该集合最终会出现重复项,要么该集合将不得不跟踪其中的变化。

于 2012-11-18T16:12:01.117 回答