簡體   English   中英

Python-從列表中刪除具有不同后綴的重復項

[英]Python - remove duplicates from list with different suffixes

我有:

['asdf/ws', 'abc/abc/', 'asdf/wss', 'asdf/', 'ab/wss', 'ab/ws', 'abc/abc/ws', 'xyz/wss']

我需要:

['asdf/ws', 'abc/abc/', 'ab/wss', 'xyz/wss']

可能的后綴是:

/
/ws
/wss
  • 前綴可以是任何字符串
  • 前綴將包含未指定數量的其他正斜杠
  • 從左側列表中選擇第一個唯一的前綴項目。

該應用程序正在ping websocket並返回具有最低延遲的連接列表,而不知道每個套接字哪個后綴正確。 有些套接字允許多個后綴,有些僅允許一種類型。 有時,套接字管理員會更改所需的后綴,恕不另行通知。 每個套接字返回ping后,該列表將按延遲進行排序,但隨后我需要刪除重復項。

通常,要刪除列表中的重復項,我會這樣做:

list(set(my_List))

但這在這里不起作用

lst = ['asdf/ws', 'abc/abc/', 'asdf/wss', 'asdf/', 'ab/wss', 'ab/ws', 'abc/abc/ws', 'xyz/wss']

# use a set to cache duplicates
caches = set()
results = []

for item in lst:

    prefix = item.rsplit('/', 2)[0]

    # check whether prefix already exists
    if prefix not in caches:

        results.append(item)
        caches.add(prefix)

results
# ['asdf/ws', 'abc/abc/', 'ab/wss', 'xyz/wss']

首先,我們僅提取具有所需后綴的元素(注意忽略重復,請注意,這可能會更改順序!)

proc1= list(set([x for x in test if x.endswith('/') or x.endswith('/ws') or x.endswith('/wss')]))

在下一步中,我們使用兩個列表。 一個用於存儲已經包含的前綴,另一個用於存儲所需的元素。 如果已經使用了前綴,請不要在該前綴中包含元素,然后檢查下一個。

proc_f = []
proc_suff = []
for x in proc1:
    if x.split("/")[0] not in proc_suff:
        proc_suff.append(x.split("/")[0])
        proc_f.append(x)

prof_f
['ab/ws', 'asdf/wss', 'abc/abc/ws', 'xyz/wss']

您可以使用enumerate檢查是否已發現任何前綴,即在返回的ping響應中,具有相同前綴的連接位於其后:

import re
s = ['asdf/ws', 'abc/abc/', 'asdf/wss', 'asdf/', 'ab/wss', 'ab/ws', 'abc/abc/ws', 'xyz/wss']
new_s = [a for i, a in enumerate(s) if not any(re.findall('^[a-zA-Z]+', a)[0] == re.findall('^[a-zA-Z]+', c)[0] for c in s[:i])]

輸出:

['asdf/ws', 'abc/abc/', 'ab/wss', 'xyz/wss']

您可以嘗試dict方法:

data=['asdf/ws', 'abc/abc/', 'asdf/wss', 'asdf/', 'ab/wss', 'ab/ws', 'abc/abc/ws', 'xyz/wss']

unique_items={}
for i in data:
    data_suffic=i.split('/')
    if data_suffic[0] not in unique_items:
        unique_items[data_suffic[0]]="/".join(data_suffic)

print(unique_items.values())

['abc/abc/', 'asdf/ws', 'ab/wss', 'xyz/wss']

為保持訂單而更新:

data=['asdf/ws', 'abc/abc/', 'asdf/wss', 'asdf/', 'ab/wss', 'ab/ws', 'abc/abc/ws', 'xyz/wss']

unique_items={}
for j,i in enumerate(data):
    data_suffic=i.split('/')
    if data_suffic[0] not in unique_items:
        unique_items[data_suffic[0]]=(j,"/".join(data_suffic))

print(list(map(lambda x:x[1],sorted(unique_items.values(),key=lambda x:x[0]))))

輸出:

['asdf/ws', 'abc/abc/', 'ab/wss', 'xyz/wss']

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM