Python检查元组的相等性

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

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

实际的数组远大于此.

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

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

我尝试创建一组独特的元组.
像这样:

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(lambda x: tuple(sorted(x)), consarray))

或者使用fronzensets而不是元组:

conset = set(map(frozenset, consarray))

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

conset = set()
for x in consarray:
    x = frozenset(x) 
    if x in conset:
        continue
    conset.add(x)
上一篇:c – 运行时来自元组的Feed模板函数元素?


下一篇:Python 2.6字典构建器表示法