我有一个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)