Python排序唯一列表中列表的项
我在StackOverflow上找不到关于我这个具体问题的提问,所以如果之前有人问过,请见谅!
总之,我正在写一个脚本,目的是遍历一组网址,并给我一个包含独特网址和独特参数的列表。
我遇到的问题是,如何比较这些参数,以消除重复的情况。这有点难以解释,所以我觉得举几个例子会更好:
假设我有这样一组网址:
- hxxp://www.somesite.com/page.php?id=3&title=derp
- hxxp://www.somesite.com/page.php?id=4&title=blah
- hxxp://www.somesite.com/page.php?id=3&c=32&title=thing
- hxxp://www.somesite.com/page.php?b=33&id=3
我已经把每个网址解析成一个列表的列表,最终我得到了这样的列表:
sort = [['id', 'title'], ['id', 'c', 'title'], ['b', 'id']]
我需要找到一种方法,让我的列表在这个时候只包含两个列表:
new = [['id', 'c', 'title'], ['b', 'id']]
现在我有一些东西需要整理,我知道我快成功了,但我已经为此绞尽脑汁好几天了 :(. 有什么想法吗?
提前谢谢你们! :)
编辑:抱歉没说清楚!这个脚本的目的是在爬虫抓取后,找到网页应用的独特入口点。基本上,如果一个网址有三个独特的入口点:
['id', 'c', 'title']
我更希望得到这个,而不是同一个链接只有两个独特入口点,比如:
['id', 'title']
所以我需要我的新列表去掉那个只有两个入口点的,优先保留那个有三个入口点的,前提是较小的变量在较大的集合中。如果还有不清楚的地方,请告诉我,谢谢大家的快速回复! :)
1 个回答
5
我假设这里的子集被认为是“重复的”(当然是非交换的)……
首先,把每个查询转换成一个集合,并将它们从大到小排序。然后,如果某个查询不是已经添加的查询的子集,就把它添加到一个新的列表中。因为任何集合都是它自己的子集,所以这个逻辑也能处理完全相同的重复项:
a = []
for q in sorted((set(q) for q in sort), key=len, reverse=True):
if not any(q.issubset(Q) for Q in a):
a.append(q)
a = [list(q) for q in a] # Back to lists, if you want