双向删除重复的起始节点和结束节点



我只是python的初学者,这似乎是一个简单的解决方案,但由于我对python的了解有限,我一直在努力。

我有两个成对的列表:

s = [0,1,2,3,4,5,6,7,3,5,7]
t = [2,4,6,2,1,6,3,1,7,4,1]

这可以解释为线路的起始节点和结束节点,因此0连接到2,1连接到4,依此类推

我想删除所有重复的"线"或节点对,在本例中,7->1重复两次,1->4在另一个方向4->1重复。我想删除两种类型的重复并得到结果:

S = [0,1,2,3,5,6,7,3,5]
T = [2,4,6,2,6,3,1,7,4]

需要保留开始和结束的顺序和对。

我希望这是有意义的,任何帮助都将不胜感激!

您可以使用一个配对集并按以下顺序对列表进行重复数据消除:

s = [0,1,2,3,4,5,6,7,3,5,7]
t = [2,4,6,2,1,6,3,1,7,4,1]
seen=set()
li=[]
for t in zip(s,t):
if frozenset(t) not in seen:
li.append(t)
seen.add(frosenset(t))
S,T=map(list,(zip(*li))) 

结果:

>>> S
[0, 1, 2, 3, 5, 6, 7, 3, 5]
>>> T
[2, 4, 6, 2, 6, 3, 1, 7, 4]   

注意:此可以简化为:

seen=set()
S,T=zip(*[t for t in zip(s,t) if frozenset(t) not in seen and not seen.add(frozenset(t))])

但有些人会反对在列表理解中使用副作用。我个人认为在这种情况下是可以的,但循环形式被许多人认为更好,因为它更容易阅读。

您可以将这些列表zip放在一起,并使用set理解

u = {tuple({a,b}) for (a,b) in (zip(s,t))}
# u: {(0, 2), (1, 4), (1, 7), (2, 3), (2, 6), (3, 6), (3, 7), (4, 5), (5, 6)}
first, sec = zip(*u)
# first: (6, 6, 5, 4, 3, 6, 7, 7, 2)
# sec  : (2, 5, 4, 1, 2, 3, 1, 3, 0)

我们使用tuple使objs可散列。


请注意,集合是无序的,所以如果顺序很重要,请突出显示在你的问题中


要保留订单,请检查@Dawg的answes。在他取消删除后,我对这个案件的解决方案与他非常相似;(

最新更新