Python检查元组的相等性

3

我有一个numpy数组,包含源IP和目标IP。

consarray
array([['10.125.255.133', '104.244.42.130'],
   ['104.244.42.130', '10.125.255.133']], dtype=object)

实际数组比这个要大得多。

我想从数组中创建一组唯一的连接对:

在给定的例子中,很明显NumPy数组的两行都是同一个连接的一部分(只是源和目标互换了,因此它是出站和入站)。

我尝试创建一组唯一的元组,就像这样:

conset = set(map(tuple,consarray))
conset
{('10.125.255.133', '104.244.42.130'), ('104.244.42.130', '10.125.255.133')}

我希望的是将('10.125.255.133','104.244.42.130')和('104.244.42.130','10.125.255.133')视为相同,以便只有其中一个出现在集合中。请问我该如何做?
编辑:
有一些很好的答案,但实际上我还有另一个要求,
我希望始终保留第一次出现的连接,而不考虑IP地址。
在上面的例子中:('10.125.255.133','104.244.42.130')首先出现,所以它是传出连接,我想保留这个连接。
如果上面的例子改变为:
consarray
array(['104.244.42.130', '10.125.255.133']],
    [['10.125.255.133', '104.244.42.130'],dtype=object)

我希望 ('104.244.42.130','10.125.255.133') 能够保留。

2
set(frozenset(el) for el in consarray) 这样写是否符合你的需求? - Jon Clements
@JonClements 太聪明了!谢谢。它是否总是确保第一个被保留,第二个被忽略? - Vikash Balasubramanian
我不相信它会... - Jon Clements
@VikashB 在集合(或不可变集合)中,元素的顺序是不确定的。 - Łukasz Rogalski
1
@JonClements 在使用frozenset的情况下,一个不太可能的副作用是当两个IP地址都相同时(希望是不可能的),你会得到一个只有1个元素的frozenset。稍后,如果你尝试获取集合的“两个”成员,它将不会像你期望的那样。 - donkopotamus
@donkopotamus 嗯,对于我的数据来说这是一个不可能的情况,这是一件好事,但是排序的问题会给我带来麻烦。 - Vikash Balasubramanian
3个回答

3

在创建元组之前,您可以对其进行排序

conset = set(map(lambda x: tuple(sorted(x)), consarray))

或者使用不可变集合(frozensets)代替元组(tuples)

conset = set(map(frozenset, consarray))

为了保证第一个项目被保留,而第二个项目不被插入,你可以使用一个常规的 for 循环:
conset = set()
for x in consarray:
    x = frozenset(x) 
    if x in conset:
        continue
    conset.add(x)

好的,你能解释一下 frozenset 方法是如何工作的吗?我查看了文档,但不太清楚。你也能具体说明哪个将被删除吗?第一个会始终被保留吗? - Vikash Balasubramanian
frozensets 是不可变且可哈希的 set 变体。一个 set 不能嵌套在另一个 set 中,因此您需要使用 frozenset - Moses Koledoye

1

你可以先对它们进行排序:

conset = set(map(tuple, map(sorted, consarray)))
print (conset)

给出:
{('10.125.255.133', '104.244.42.130')}

1

由于您正在使用numpy,因此可以使用numpy.unique,例如:

a = np.array([('10.125.255.133', '104.244.42.130'), ('104.244.42.130', ' 10.125.255.133')])

然后,np.unique(a) 会给你以下结果:
array(['10.125.255.133', '104.244.42.130'], dtype='<U14')

好的,我已经编辑了问题,但是这个解决方案似乎可以保证较小 IP 地址在第一个元组中被保留,实际上我想要第一个元组被保留,而不管 IP 是什么。 - Vikash Balasubramanian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接