如何从字符串中获取唯一值而不删除delimi

2024-04-24 22:50:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我必须从字符串中删除重复值,其中子值由分隔符分隔。我的示例字符串类似于"aa~*yt~*cc~*aa",其中~*是分隔符,需要删除aa的重复出现

我也尝试过使用setcmmand和下面的代码,但它们的输出是

"a~*ytc"

但是我需要输出:

"aa~*yt~*cc"

d = {}
s="aa~*yt~*cc~*aa"
res=[]
for c in s:
    if c not in d:
      res.append(c)
      d[c]=1
print ("".join(res))

我已经看过许多答案,但无法解决这个问题。如果有什么解决办法,请告诉我。谢谢,非常感谢您抽出时间:)


Tags: 字符串代码in示例forifnotres
3条回答

您可以使用分隔符^{}字符串,将结果listset作为分隔符(以删除重复项),根据原始字符串中的出现顺序对元素进行排序,并再次^{}设置~作为分隔符:

s = "aa~*yt~*cc~aa"

'~'.join(sorted(set(s.split('~')), key=s.index))
# 'aa~*yt~*cc'

如果性能很重要,请事先定义用于对结果集排序的字典:

l = s.split('~')
length = len(l)
d = {j:length-i for i,j in enumerate(l[::-1])}
# {'aa': 1, '*cc': 3, '*yt': 2}
'~'.join(sorted(set(l), key=lambda x: d[x]))
# 'aa~*yt~*cc'

可以将enumeratere.findall一起使用:

import re
d = "aa~*yt~*cc~aa" 
new_d = re.findall('\w+|[\W]', d)
r, c = [a for i, a in enumerate(new_d) if a.isalpha() and a not in new_d[:i]], iter([i for i in new_d if not i.isalpha()])
result = ''.join(f'{a}{next(c)}{next(c)}' if i < len(r) - 1 else a for i, a in enumerate(r))

输出:

'aa~*yt~*cc'

对于re.findall,不需要预先知道分隔符字符。你知道吗

子串的顺序是否相关?你知道吗

如果顺序不重要:

print("~".join(set("aa~*yt~*cc~aa".split("~"))))

如果订单很重要:

#f7 function source: https://stackoverflow.com/a/480227/11971785
def f7(seq):
    seen = set()
    seen_add = seen.add
    return [x for x in seq if not (x in seen or seen_add(x))]

print("~".join(f7("aa~*yt~*cc~aa".split("~"))))

相关问题 更多 >