使用python删除冗余的节点集

时间:2018-06-11 16:07:22

标签: python arrays python-3.x list

我有一个开始和结束节点列表以及每个节点的xy坐标。所以像这样:

Node A   Node B
  0       1
  2       3
  4       5
  20      21
  20      41
  20      21

上表被解释为点0,其中(x_0,y_0)通过(x_1,y_1)连接到点1所以总共有6个列表节点A,节点B,X_A,Y_A,X_B,Y_B。 / p>

一条线重复20到21,所以它也在A和B的XY坐标列表中重复。我想从节点A和节点B列表中删除重复的节点以及X中的相应重复坐标Y列出A和B.我不知道该怎么做。

请注意,相同的节点可以连接到不同的节点,在这种情况下,20连接到21和41,但我只想删除第二个连接到21,因为它是重复的,而不删除20到41的连接。

最后我想得到:

Node A   Node B
  0       1
  2       3
  4       5
  20      21
  20      41

他们的坐标。

2 个答案:

答案 0 :(得分:0)

假设您的号码在两个单独的列表中,

node_A = [0, 2, 4, 20, 20, 20] 
node_B = [1, 3, 5, 21, 41, 21]

,您可以使用内置zip函数将元素元素与元组组合使用,并使用fromkeys中的dict方法将元组作为字典的键。

node_AB = dict.fromkeys(zip(node_A, node_B)) 

由于字典的键是唯一的,它会自动删除重复的元组。 如果要将元组分离回列表,可以使用列表推导并将元组的每个第一个元素用于node_A,将元组的每个第二个元素用于node_B。

node_A_unique = [x[0] for x in node_AB]
node_B_unique = [x[1] for x in node_AB]

答案 1 :(得分:0)

如果这些行中的每一行都是一对,那么创建一对配对列表,然后将其转换为set

nodes = [
# A  ,    B
( 0  ,    1),
( 2  ,    3),
( 4  ,    5),
( 20 ,    21),
( 20 ,    41),
( 20 ,    41),
]

print nodes
print set(nodes)

输出:

[(0, 1), (2, 3), (4, 5), (20, 21), (20, 41), (20, 41)]
set([(0, 1), (4, 5), (20, 21), (2, 3), (20, 41)])