【问题标题】:Removing redundant set of nodes using python使用python删除冗余节点集
【发布时间】:2018-06-12 05:43:40
【问题描述】:

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

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

上表解释为点 0 与 (x_0, y_0) 连接到点 1 与 (x_1, y_1) 所以总共有 6 个列表节点 A、节点 B、X_A、Y_A、X_B、Y_B。

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

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

最后我想得到:

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

还有它们的坐标。

【问题讨论】:

  • 为什么最终节点 A 示例中有两个 '20'?
  • 节点可以多次连接到不同的节点,所以点20可以连接到21和41。
  • 你是说你的例子的每一行都是一对吗? (0,1),(2,3),(4,5),(20,21),(20,41)?如果是这样,为每一行创建一个元组并放入一个集合中。

标签: python arrays python-3.x list


【解决方案1】:

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

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

,您可以使用内置的zip 函数将它们的条目元素组合成元组,并使用来自dictfromkeys 方法将元组用作字典的键。

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]

【讨论】:

  • 为什么是dict 而不是set
【解决方案2】:

如果这些行中的每一行都是一对,则创建一个对列表,然后将其转换为 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)])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-13
    • 2021-01-22
    • 2021-03-20
    • 1970-01-01
    相关资源
    最近更新 更多