代码之家  ›  专栏  ›  技术社区  ›  litepresence

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

  •  0
  • litepresence  · 技术社区  · 8 年前

    我有:

    ['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 回复  |  直到 8 年前
        1
  •  2
  •   akuiper    8 年前
    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']
    
        2
  •  2
  •   Ajax1234    8 年前

    您可以使用 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
  •  2
  •   pythonic833    8 年前

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

    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']
    
        4
  •  1
  •   Aaditya Ura    8 年前

    您可以尝试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']
    
    推荐文章