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

时间:2018-07-12 17:11:23

标签: python list duplicates

我只是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]

必须保留顺序以及开始和结束对。

我希望这是有道理的,非常感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

您可以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的答案。在他取消删除后,我对他的解决方案与他非常相似;)

答案 1 :(得分:1)

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

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))])

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

相关问题