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