Python检查元组的相等性

时间:2016-10-06 11:08:19

标签: python tuples

我有一大堆源和目标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;)。

3 个答案:

答案 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\">&times;</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\">&times;</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')