Python 已排序列表中的变量分隔符转换为字符串

Python 已排序列表中的变量分隔符转换为字符串,python,regex,pandas,Python,Regex,Pandas,我目前正在尝试将已排序的字符列表转换为字符串。如果前后字符不同,则此字符串的分隔符应为“-”,如果这些字符相等,则分隔符应为“&” 例如: 列表['1','1','2','9','A','A','A','B','C']应该变成'1&1-2-9-A&A-B-C' 在一个数据帧中,大约有250K个列表会发生这种情况。我正在考虑创建一个包含所有分隔符“-”的字符串,并使用str.replace函数替换它们,但最后一部分会被卡住 我当前代码的简化如下,“sorted”列包含如上所述的已排序字符列表 df

我目前正在尝试将已排序的字符列表转换为字符串。如果前后字符不同,则此字符串的分隔符应为“-”,如果这些字符相等,则分隔符应为“&”

例如: 列表['1','1','2','9','A','A','A','B','C']应该变成'1&1-2-9-A&A-B-C'

在一个数据帧中,大约有250K个列表会发生这种情况。我正在考虑创建一个包含所有分隔符“-”的字符串,并使用str.replace函数替换它们,但最后一部分会被卡住

我当前代码的简化如下,“sorted”列包含如上所述的已排序字符列表

df['joined'] = df['sorted'].str.join('-')
df['correct'] = df['joined'].str.replace(r"\-(.\-)\1{1,}?", xxxx, regex=True)
是否有一个正则表达式模式可以替换xxxx,该模式可以执行与第一个模式相同的部分,而“.”是原始字符?或者是否存在另一种解决方案,例如匹配的正向后向和前向?
谢谢

我会按照以下方式做:

import re
chars = ['1', '1', '2', '9', 'A', 'A', 'A', 'B', 'C']
joined = '-'.join(chars)
result = re.sub(r'(.)-(?=\1)', r'\1&', joined)
print(result)  # 1&1-2-9-A&A&A-B-C
说明:我在这里使用了正向前瞻,检查-后面是否跟前面的字符相同。零长度断言不会捕获,这会导致正确替换-它们彼此为1,请考虑

A-A-A
匹配结果:

(A-)(A-)A
如果我们使用r'.-\1'作为模式,它将是:

(A-A)-A

因此,保留秒-不变

我将按照以下方式执行:

import re
chars = ['1', '1', '2', '9', 'A', 'A', 'A', 'B', 'C']
joined = '-'.join(chars)
result = re.sub(r'(.)-(?=\1)', r'\1&', joined)
print(result)  # 1&1-2-9-A&A&A-B-C
说明:我在这里使用了正向前瞻,检查-后面是否跟前面的字符相同。零长度断言不会捕获,这会导致正确替换-它们彼此为1,请考虑

A-A-A
匹配结果:

(A-)(A-)A
如果我们使用r'.-\1'作为模式,它将是:

(A-A)-A
因此,第二个选项保持不变