如何自定义编码字符串

时间:2018-07-12 00:22:20

标签: python python-3.x encryption

我有一个自定义密码,想用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”的数目。

2 个答案:

答案 0 :(得分:4)

在提出此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'

答案 1 :(得分: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'