[英]Remove duplicates and substrings from a list of strings
假設我有一個列表:
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
function 以更好地選擇組中的最佳項目。
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)
Output:
['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”,但不會過濾掉子字符串。 正如 Caveman 船長在他的評論中所寫,這需要更多的澄清。
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
它可能不是最好的方法,但它確實可以按照您的意願進行操作。 它首先檢查輸入列表中的字符串是否不在 output 列表中。 然后它檢查它的任何部分是否已經在 output 字符串之一中。 如果不是這種情況,它將把它添加到 output 列表中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.