Python检查元组的相等性

Python检查元组的相等性,python,tuples,Python,Tuples,我有一个源和目标ip的numpy数组 consarray array([['10.125.255.133', '104.244.42.130'], ['104.244.42.130', '10.125.255.133']], dtype=object) 实际阵列比这个大得多 我想从阵列中创建一组唯一的连接对: 在给定的示例中:很明显,numpy数组的两行都是同一连接的一部分(只是src和destination是互换的,所以它分别是传出和传入的) 我尝试创建一组唯一的元组。 像这样: co

我有一个源和目标ip的numpy数组

consarray
array([['10.125.255.133', '104.244.42.130'],
   ['104.244.42.130', '10.125.255.133']], dtype=object)
实际阵列比这个大得多

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

在给定的示例中:很明显,numpy数组的两行都是同一连接的一部分(只是src和destination是互换的,所以它分别是传出和传入的)

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

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')。

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

conset = set(map(tuple, map(sorted, consarray)))
print (conset)
给出:

{('10.125.255.133', '104.244.42.130')}
您可以在生成元组之前应用排序:

或者使用Fronzenset而不是元组:

为了保证第一个项目将被保留,第二个项目不会被插入,您可以使用常规的
for
循环:

conset = set()
for x in consarray:
    x = frozenset(x) 
    if x in conset:
        continue
    conset.add(x)

由于您使用的是
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')

array(['10.125.255.133','104.244.42.130',dtype='Does
set(consarray中el的frozenset(el)
做你想做的事?@JonClements Genius!谢谢。它总是确保第一个被保留,第二个被忽略吗?我不相信它会…@VikashB order in set(或frozenset)不保证。@JonClements使用冻结集的一个不太可能的副作用是,两个ip地址相同(希望不可能),只留下一个只有1个元素的冻结集。稍后,如果您尝试获取“2”集合的成员它不会像你期望的那样出现好的,你能解释一下frozenset方法是如何工作的吗,我查看了文档,但不清楚,你能不能指定哪一个会被删除,第一个总是会被保留?frozenset是集合变量,是不可变的和散列的。集合不能嵌套在另一个集合,所以你将使用一个冻结集。我已经编辑了这个问题,但是这个解决方案似乎可以保证较小的ip地址最先出现的元组将被保留,实际上我希望不管ip如何,第一个元组都会被保留。
a = np.array([('10.125.255.133', '104.244.42.130'), ('104.244.42.130', ' 10.125.255.133')])
array(['10.125.255.133', '104.244.42.130'], dtype='<U14')