如何自定义编码字符串

2024-04-25 19:52:27 发布

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

我有一个自定义密码,想用python做一个程序给我加密。我没有给出确切的细节,但我期待着改变一个字符串到另一个字符串。你知道吗

例如:

"YYNNNYYN NNYNNNY YYYYNYNN YNYNNNYY" 

将更改为

"@2#6@2#1 #2@1#3@1 @4#1@1#2 @1#2@1#3@2" 

所以“Y”将改为@,后跟连续的“Y”的数目,相同的“N”将改为#,后跟连续的“N”的数目


Tags: 字符串程序密码细节数目nnynnnyyyyynynnyynnnyyn
2条回答

在提出这个groupby解决方案时,我遵循了您对所需输出的描述。结果与输入的示例输出略有不同。你知道吗

from itertools import groupby

def convert(k, g):
    if k == " ":
        return ''.join(g)
    elif k == 'Y':
        return "@{}".format(sum(1 for _ in g))
    elif k == 'N':
        return "#{}".format(sum(1 for _ in g)) 

def cipher(s):
    return ''.join([convert(k, g) for k, g in groupby(s)])

cipher("YYNNNYYN NNYNNNY YYYYNYNN YNYNNNYY")
# '@2#3@2#1 #2@1#3@1 @4#1@1#2 @1#1@1#3@2'

可以使用pandas按连续值和transform值分组

设置:

x = "YYNNNYYN NNYNNNY YYYYNYNN YNYNNNYY" 
df = pd.DataFrame({'chars':list(x)})
d = {"Y":"@", "N":"#"}

那你就可以了

g = (df['chars'] != df['chars'].shift()).cumsum()
''.join(df.groupby(g).sum().chars.transform(lambda k: d.get(k[0], k)+str(len(k)) if k.strip() else k))

输出

'@2#3@2#1 #2@1#3@1 @4#1@1#2 @1#1@1#3@2'

相关问题 更多 >