通过子字符串检查列表中的元素

Zlo*_*Zlo 5 python list

我有一个urls(unicode)列表,并且有很多重复.例如,网址http://www.myurlnumber1.comhttp://www.myurlnumber1.com/foo+%bar%baz%qux指向同一个地方.

所以我需要清除所有这些重复项.

我的第一个想法是检查元素的子字符串是否在列表中,如下所示:

for url in list:
    if url[:30] not in list:
        print(url)
Run Code Online (Sandbox Code Playgroud)

但是,它尝试将字面url[:30]元素作为文字元素并显然返回所有这些元素,因为没有完全匹配的元素url[:30].

有没有简单的方法来解决这个问题?

编辑:

网址中的主机和路径通常保持不变,但参数不同.出于我的目的,具有相同主机名和路径但不同参数的URL仍然是相同的URL并构成重复.

Pad*_*ham 6

如果你认为任何netloc是相同的,你可以解析 urllib.parse

from urllib.parse import  urlparse # python2 from urlparse import  urlparse 

u = "http://www.myurlnumber1.com/foo+%bar%baz%qux"

print(urlparse(u).netloc)
Run Code Online (Sandbox Code Playgroud)

哪个会给你:

www.myurlnumber1.com
Run Code Online (Sandbox Code Playgroud)

因此,要获得独特的netlocs,您可以执行以下操作:

unique  = {urlparse(u).netloc for u in urls}
Run Code Online (Sandbox Code Playgroud)

如果你想保留网址方案:

urls  = ["http://www.myurlnumber1.com/foo+%bar%baz%qux", "http://www.myurlnumber1.com"]

unique = {"{}://{}".format(u.scheme, u.netloc) for u in map(urlparse, urls)}
print(unique)
Run Code Online (Sandbox Code Playgroud)

假设它们都有方案,并且您没有相同netloc的http和https,并认为它们是相同的.

如果您还想添加路径:

unique = {u.netloc, u.path) for u in map(urlparse, urls)}
Run Code Online (Sandbox Code Playgroud)

属性表列在文档中:

Attribute   Index   Value   Value if not present
scheme  0   URL scheme specifier    scheme parameter
netloc  1   Network location part   empty string
path    2   Hierarchical path   empty string
params  3   Parameters for last path element    empty string
query   4   Query component empty string
fragment    5   Fragment identifier empty string
username        User name   None
password        Password    None
hostname        Host name (lower case)  None
port        Port number as integer, if present  None
Run Code Online (Sandbox Code Playgroud)

你只需要使用你认为是独特部分的任何东西.

In [1]: from urllib.parse import  urlparse

In [2]: urls = ["http://www.url.com/foo-bar", "http://www.url.com/foo-bar?t=baz", "www.url.com/baz-qux",  "www.url.com/foo-bar?t=baz"]


In [3]: unique = {"".join((u.netloc, u.path)) for u in map(urlparse, urls)}

In [4]: 

In [4]: print(unique)
{'www.url.com/baz-qux', 'www.url.com/foo-bar'}
Run Code Online (Sandbox Code Playgroud)