diff = list(set(map(tuple, paths1)) - set(map(tuple, paths2)))
paths1
和paths2
是成对列表的列表。
示例:
paths1 = [[(1,2),(2,3),(3,4)],[(1,3),(3,5)]]
paths2 = [[(5,2),(2,3),(3,4)],[(1,3),(3,5)]]
print(list(set(map(tuple, paths1)) - set(map(tuple, paths2))))
应输出[((1, 2), (2, 3), (3, 4))]
。内部列表必须首先转换为元组,因为无法将这种类型的列表散列到集合中。
在下面提供的C ++代码中,我尝试使用标准库中的set_difference函数:
#include <iostream>
#include <vector>
#include <utility>
#include <algorithm>
int main () {
std::vector < std::pair < int, int >>v1 =
{ std::make_pair (1, 2), std::make_pair (2, 3), std::make_pair (3, 4) };
std::vector < std::pair < int, int >>v2 =
{ std::make_pair (5, 2), std::make_pair (2, 3), std::make_pair (3, 4) };
std::vector < std::pair < int, int >>v3 =
{ std::make_pair (1, 3), std::make_pair (3, 5) };
std::vector < std::vector < std::pair < int, int >>>V1 = { v1, v3 };
std::vector < std::vector < std::pair < int, int >>>V2 = { v2, v3 };
std::vector < std::vector < std::pair < int, int >>>diff;
std::set_difference (V1.begin (), V1.end (), V2.begin (), V2.end (),
std::inserter (diff, diff.begin ()));
std::cout << "[";
for (auto v : diff) {
std::cout << "[";
for (auto p : v)
std::cout << "(" << p.first << "," << p.second << ")";
std::cout << "]";
}
std::cout << "]\n";
}
此代码显示为[[(1,2)(2,3)(3,4)][(1,3)(3,5)]]
。为什么应该删除第二个内部列表?
答案 0 :(得分:4)
Python集基于哈希。因此,Python集差异的工作原理是迭代左集,在右集的哈希图中向上查找每个元素,然后跳过匹配的元素。
C ++集基于排序(实际上是二进制搜索树),而不是散列。可以使用相同的算法,但是需要使用(对数线性而不是线性时间。因此,他们使用了在线性时间内有效的 的另一种算法:假设两个范围都已排序,则只需遍历两个平行。
因此,C ++ set_difference
仅适用于排序范围:
将在排序范围
[first1, last1)
中找不到的元素从排序范围[first2, last2)
复制到从d_first
开始的范围。
当您为它提供未排序的范围时,它不知道您已经做到了,而是试图并行进行遍历,并感到困惑。在左侧列表通过(5, 2)
之后,它已经超过了所有其他元素,因此没有其他内容被跳过。