假设我有一个列表:
a = [
'www.google.com',
'google.com',
'tvi.pt',
'ubs.ch',
'google.it',
'www.google.com'
]
我想删除重复和子字符串,以保持一个列表,如:
b = [
'www.google.com',
'tvi.pt',
'ubs.ch',
'google.it'
]
你知道有效的方法吗?
目标是保留较长的字符串,这就是为什么首选www.google.com
而不是google.com
的原因。
可以对该解决方案进行编辑以更好地满足您的需求。编辑get_domain
函数以更好地选择分组条件*,编辑choose_item
函数以更好地选择组中的最佳项目。
from itertools import groupby
a = ['www.google.com', 'google.com', 'tvi.pt', 'ubs.ch', 'google.it', 'www.google.com']
def get_domain(url):
# Example: 'www.google.com' -> 'google.com'
return '.'.join(url.split('.')[-2:])
def choose_item(iterable):
# Ex. input: ['www.google.com', 'google.com', 'www.google.com']
# Ex. output: 'www.google.com' (longest string)
return sorted(iterable, key=lambda x: -len(x))[0]
results = []
for domain,grp in groupby(sorted(a, key=get_domain), key=get_domain):
results.append(choose_item(grp))
print(results)
输出:
['www.google.com', 'google.it', 'tvi.pt', 'ubs.ch']
*另一个答案是tld库。
如果您正在寻找的是一个唯一的一级域名列表,给定任意url列表,请查看tld
模块。这会使事情对你来说更容易。
根据文档,这里有一个片段,您可以根据自己的需要进行调整:
from tld import get_fld
urls = [
'www.google.com',
'google.com',
'tvi.pt',
'ubs.ch',
'google.it',
'www.google.com'
]
unique_domains = list({
get_fld(url, fix_protocol=True) for url in urls
})
上面的代码将设置unique_domains
:
['ubs.ch', 'google.it', 'tvi.pt', 'google.com']
您可以按以下方式删除重复项:
f = list(dict.fromkeys(a))
这将过滤掉重复的'www.google.com',但不会过滤掉子字符串。正如穴居人队长在他的评论中所写的那样,这需要更多的澄清。
def remove_duplicates_and_substrings(input):
output = []
for i in input:
if i not in output:
if not any(i in s for s in output):
output.append(i)
return output
这可能不是最好的方法,但它确实是你想要它做的。它首先检查输入列表中的字符串是否已经在输出列表中。然后,它检查其中的任何部分是否已经在其中一个输出字符串中。如果不是这样,它将把它添加到输出列表中。