Python排序唯一列表中列表的项

2 投票
1 回答
1935 浏览
提问于 2025-04-17 02:58

我在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

撰写回答