Python - 从列表中删除具有不同后缀的重复项

时间:2018-04-05 15:33:43

标签: python list sorting set

我有:

['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 websockets并返回具有最低延迟的连接列表,而不知道每个套接字的哪个后缀是正确的。有些套接字允许多个后缀,有些只允许一种类型。有时,套接字的管理员会更改所需的后缀,恕不另行通知。每个套接字返回ping后,列表按延迟排序,但后来我需要删除重复项。

通常,要删除列表中的重复项,我会这样做:

list(set(my_List))

但这不起作用

4 个答案:

答案 0 :(得分:2)

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']

答案 1 :(得分:2)

首先,我们只提取具有所需后缀的元素(结束忽略重复,注意这可能会改变顺序!)

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']

答案 2 :(得分:2)

您可以使用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']

答案 3 :(得分:1)

您可以尝试使用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']