我有一大堆源和目标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',&# 39; 10.125.255.133')被认为是相同的,只有其中一个将在集合中。
有谁能告诉我我该怎么做呢?
修改
有一些很好的答案,但实际上我想要另一个要求,
我希望第一次出现的应该始终是保留的,而不管ip地址。
在上面的例子中:(&#39; 10.125.255.133&#39;,&#39; 104.244.42.130&#39;)首先出现,所以它是传出连接,我想保留它。< / p>
如果以上示例更改为:
consarray
array(['104.244.42.130', '10.125.255.133']],
[['10.125.255.133', '104.244.42.130'],dtype=object)
我希望保留(&#39; 104.244.42.130&#39;,&#39; 10.125.255.133&#39;)。
答案 0 :(得分:3)
您可以在制作元组之前应用排序:
//DB setting
include '../../../plugins/MySQL/connect_db.php';
// Create connection
$conn = new mysqli($dbhost,$dbuser,$dbpass,$dbname);
// Check connection
if ($conn->connect_error) {
$_SESSION["error"] = "DB Connection failed..."; //Error Message
}
// clear variables
$querystring1 = ""; $querystring2 = "";
foreach($_POST as $key => $var) {
$querystring2 .= "'".$var."',"; $querystring1 .= $key.",";
}
$query1 = "(".$querystring1.") VALUES (".$querystring2.")";
$sql = "INSERT INTO `qci_modreport` $query1";
print $sql;
if (!$conn->query($sql)) {
echo "
<div class=\"alert alert-danger alert-dismissible\">
<button type=\"button\" class=\"close\" data-dismiss=\"alert\" aria-hidden=\"true\">×</button>
<h4><i class=\"icon fa fa-ban\"></i> Error!</h4>
There was an error while excuting this query.<br />
(" . $conn->errno . ") " . $conn->error . "
</div>";
} else {
echo "
<div class=\"alert alert-success alert-dismissible\">
<button type=\"button\" class=\"close\" data-dismiss=\"alert\" aria-hidden=\"true\">×</button>
<h4><i class=\"icon fa fa-check\"></i> Alert!</h4>
Success, record updated successfully. Refreshing database now...
</div>";
}
//close connection
$conn->close();
或使用 fronzensets 代替元组:
conset = set(map(lambda x: tuple(sorted(x)), consarray))
为了保证第一项保留而第二项未插入,您可以使用常规 conset = set(map(frozenset, consarray))
循环:
for
答案 1 :(得分:1)
您可以先对它们进行排序:
conset = set(map(tuple, map(sorted, consarray)))
print (conset)
给出:
{('10.125.255.133', '104.244.42.130')}
答案 2 :(得分: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')