如何将字母顺序上最小的字母替换为1,下一个最小的字母替换为2,但不丢弃一个字母的多次出现?

2024-10-03 06:19:22 发布

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

我使用的是python3,我想写一个函数,它接受所有大写字母的字符串,所以假设s = 'VENEER',并给出以下输出'614235'。在

到目前为止,我的功能是:

def key2(s):
    new=''
    for ch in s:
        acc=0
        for temp in s:
            if temp<=ch:
                acc+=1
        new+=str(acc)
    return(new)

如果s == 'VENEER',则new == '634335'。如果s不包含重复项,则代码可以完美地工作。在

我被困在如何编辑代码以获得开头所述的输出。在


Tags: 函数字符串代码in功能newfordef
3条回答

一种方法是使用numpy.argsort来查找顺序,然后查找列组,并将它们连接起来:

>>> s = 'VENEER'
>>> order = np.argsort(list(s))
>>> rank = np.argsort(order) + 1
>>> ''.join(map(str, rank))
'614235'

您可以使用正则表达式:

import re

s="VENEER"
for n, c in enumerate(sorted(s), 1):
    s=re.sub('%c' % c, '%i' % n, s, count=1)

print s
# 614235

也可以使用多个嵌套生成器:

^{pr2}$

请注意,用于替换字符串中字符的内置方法^{}接受第三个参数;count。您可以利用这个优势,只替换每个字母的第一个外观(显然,一旦您替换了第一个'E',第二个字母将成为第一个外观,依此类推):

def process(s):
    for i, c in enumerate(sorted(s), 1):
##        print s # uncomment to see process
        s = s.replace(c, str(i), 1)
    return s

我使用了内置函数^{}^{}来获取适当的数字来替换字符:

^{pr2}$

用法示例:

>>> process("VENEER")
'614235'

相关问题 更多 >