将两个不同维度的列表相差得到一个新的列表

Obtain a new list from the difference of two lists of different dimensions

我正在使用 Python 2.6.2,因为它与 Abaqus 一起安装(我正在为其编写脚本)

我在处理集合之间的差异时遇到了问题。 我创建了三个集合,如下所示:

TOT_list = set(xrange(n_unitcells))                          
TOT_par = list(set(itertools.product(TOT_list, repeat = 2)))

结果

TOT_par = [(1, 3), (3, 0), (2, 1), (0, 3), (4, 0), (1, 2), (3, 3), (4, 4), (2, 2), (4, 1), (1, 1), (3, 2), (0, 0), (0, 4), (1, 4), (2, 3), (4, 2), (1, 0), (0, 1), (3, 1), (2, 4), (2, 0), (4, 3), (3, 4), (0, 2)]

POS_in = [0,0]                                               
POS_par = [[1,2],[2,3],[3,4]] 

我需要从第一个 (TOT_par) 中提取第二个两个集合 (POS_in 和 POS_par) 来获得一个新集合,即类似于:

TOT_new = list(set(TOT_par) - set(POS_in) - set(POS_par))

显然尝试直接使用集合之间的差异是行不通的。 我试着写了一些循环,但我越来越糊涂了...

你投射到 set 的深度不够。

>>> POS_in = [0,0]
>>> set(POS_in)
{0}

set(POS_par) 根本不起作用,因为它包含 lists,一种不可散列的类型。

要解决这个问题,给每个 list 一个标准结构(像 POS_par 这样的嵌套 list 会很好用),将每对变成 tuple,然后将 tuples 的容器变成 set:

>>> POS_in = [[0,0]]
>>> POS_in_set = set(map(tuple, POS_in))
>>> POS_in_set
{(0, 0)}
>>> POS_par = [[1,2],[2,3],[3,4]]
>>> POS_par_set = set(map(tuple, POS_par))
>>> POS_par_set
{(1, 2), (2, 3), (3, 4)}

然后您可以 TOT_new = list(set(TOT_par) - POS_in_set - POS_par_set).