从字符串列表中删除重复项和子字符串



假设我有一个列表:

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

这可能不是最好的方法,但它确实是你想要它做的。它首先检查输入列表中的字符串是否已经在输出列表中。然后,它检查其中的任何部分是否已经在其中一个输出字符串中。如果不是这样,它将把它添加到输出列表中。

相关内容

  • 没有找到相关文章

最新更新