![](/img/trans.png)
[英]How to detect string suffixes and remove these suffixed elements from list? - 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.