子字符串python上列表中的唯一值

子字符串python上列表中的唯一值,python,python-3.x,Python,Python 3.x,需要删除之前基于第一部分的重复值-如下所示 Input: a=['abc-123','abc-345','def-234'] Expected Output: a=['abc-123','def-234'] 我可以执行以下操作,只获取唯一值,而不包含任何子字符串部分,但无法使子字符串使用并删除重复项并仅保留第一个引用 list(set(a)) 这个怎么样对不起,我不能执行一行 head=[[a.split-[0]表示a中的a] 索引=[i代表i,如果不是头中的项,则头中的项[:i]

需要删除之前基于第一部分的重复值-如下所示

Input:   
 a=['abc-123','abc-345','def-234']
Expected Output:
 a=['abc-123','def-234']
我可以执行以下操作,只获取唯一值,而不包含任何子字符串部分,但无法使子字符串使用并删除重复项并仅保留第一个引用

list(set(a))

这个怎么样对不起,我不能执行一行

head=[[a.split-[0]表示a中的a] 索引=[i代表i,如果不是头中的项,则头中的项[:i]] 结果=[a[i]表示索引中的i]
我会这样写:

seen = set()
out = []
for elem in a:
    prefix = elem.split('-')[0]
    if prefix not in seen:
        seen.add(prefix)
        out.append(elem)
这是一条单行线:

seen = set()
[x for x in a if not (x.split('-')[0] in seen or seen.add(x.split('-')[0]))]
如果您使用的是Python>=3.8,则存在walrus运算符,因此不需要调用split两次:


如果只想删除第一部分的重复项,那么必须做一些工作来分离字符串,或者只识别第一部分。我看不出你被困在哪里;请发布给您带来麻烦的代码,而不是忽略基本问题的不适用的单行代码。循环列表,获取字符串的第一部分。检查它是否在集合中。如果是,请跳过此元素。如果不是,则将此元素添加到输出列表中,并将第一部分添加到集合中。更清楚地了解您想要完成的任务。什么时候删除一个字符串,什么时候不删除?@DanteCulaciati他只需要第一个带有每个唯一前缀的字符串。@Barmar Ok,谢谢,只是想问一下,以防他需要其他字符串。有人能解释一下head[:i]行中的if not项的作用吗?head从一开始就按顺序检查,并使用head[:i],您可以检查当前正在关注的元素之前是否出现了相同的头。您同时调用split函数两次,结果相同。你有什么办法避免这个问题吗?我想不出任何主意
[x for x in a if not ((prefix := x.split('-')[0]) in seen or seen.add(prefix))]