Python 从列表中移除相似的 URL
我刚开始学Python,遇到一个小问题,希望你们能帮我解决,就是如何从一个列表中去掉相似的重复项。
我有一个网址的列表:myList = ['http://www.mywebsite.com/shoes', 'http://wwww.yourwebsite.com/', 'http://www.mywebsite.com/shoes/']
我想去掉相似的网址,比如说http://www.mywebsite.com/shoes和http://www.mywebsite.com/shoes/其实是差不多的。我想去掉其中一个(我不在乎去掉哪个),但要保留另一个。总之就是想从列表中去掉重复的项。我可以举个例子,但我连怎么开始都不知道。
如果能给点建议就太好了。
3 个回答
这个问题可能是因为你还没有搞清楚两个网址相似到底是什么意思。我们无法帮你解决这个问题,因为只有你自己知道你的具体需求。不过,一旦你弄明白了,后面的事情就简单多了。处理这个问题有两种方法:
如果你的相似性关系是传递的,也就是说,如果
similar(a,b) 和 similar(b,c)
那么就意味着similar(a,c)
对于所有的网址a
、b
、c
都成立,那么你就可以把每个网址转换成一个标准形式。只有当两个网址的标准形式相等时,它们才算相似。所以在这种情况下,最简单的做法就是把每个网址转换成标准形式,然后从这些标准网址中创建一个集合:set(canonical(u) for u in myList)
如果你的相似性关系不是传递的,那事情就会变得复杂了,因为可能会出现像A和B相似,B和C相似,但A和C不相似的情况。那么问题就变成了,在这个例子中,你希望在去掉重复项的列表中包含哪些网址?你会包括A和C,因为它们彼此不相似,还是只包括B,因为你认为A和C都是B的相似重复项?在这种情况下,根据你想如何处理这种“模糊”的情况,有各种算法可以使用——但我们需要知道你的具体需求才能推荐合适的方案。
如果你觉得相似性就是在“\”这个地方的不同,那么你可以使用集合(这里有教程) 还有这里来从你的列表中去掉重复的项,因为:
集合是一种无序的、包含不同元素的集合。常见的用途包括检查某个元素是否在集合中、从序列中去掉重复项,以及进行一些数学运算,比如交集、并集、差集和对称差集。
myList = ['http://www.mywebsite.com/shoes', 'http://wwww.yourwebsite.com/', 'http://www.mywebsite.com/shoes/']
set(x.lstrip('\') for x in myList) # will return a set of unique urls
# In case you need list
myList = list(set(x.rstrip('\') for x in myList))
你可以这样做:
- 首先,去掉最后的斜杠
- 列出项目
去掉重复项:
set(map(lambda url: url.rstrip('/'), myList))