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

时间:2014-07-19 21:35:38

标签: python

我正在使用Python 3,我想编写一个带有所有大写字母字符串的函数,所以假设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不包含重复项,则代码可以正常运行。

我坚持如何编辑代码以获得开头所述的输出。

5 个答案:

答案 0 :(得分:4)

请注意,用于替换字符串str.replace中的字符的内置方法接受第三个参数; 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

我已使用内置函数sortedenumerate来获取替换字符的相应数字:

1 2 3 4 5 6 # 'enumerate' from 1 -> 'i'
E E E N R V # 'sorted' input 's' -> 'c'

使用示例:

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

答案 1 :(得分:1)

一种方法是使用numpy.argsort查找订单,然后找到排名,然后加入它们:

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

答案 2 :(得分:1)

您可以使用正则表达式:

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

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

def indexes(seq):
    for v, i in sorted((v, i) for (i, v) in enumerate(seq)):
        yield i

print ''.join('%i' % (e+1) for e in indexes(indexes(s)))
# 614235

答案 3 :(得分:0)

从标题中,您可能想要这样做吗?

>>> from collections import OrderedDict
>>> s='VENEER'
>>> d = {k: n for n, k in enumerate(OrderedDict.fromkeys(sorted(s)), 1)}
>>> "".join(map(lambda k: str(d[k]), s))
'412113'

正如@jonrsharpe评论的那样,我不需要使用OrderedDict

答案 4 :(得分:-1)

def caps_to_nums(in_string):
    indexed_replaced_string = [(idx, val) for val, (idx, ch) in enumerate(sorted(enumerate(in_string), key=lambda x: x[1]), 1)]
    return ''.join(map(lambda x: str(x[1]), sorted(indexed_replaced_string)))

首先我们运行enumerate以保存自然排序顺序

enumerate("VENEER") -> [(0, 'V'), (1, 'E'), (2, 'N'), (3, 'E'), (4, 'E'), (5, 'R')]
# this gives us somewhere to RETURN to later.

然后我们根据其第二个元素(按字母顺序排序)对其进行排序,并再次使用起始值enumerate运行1以获取替换值。我们扔掉了alpha值,因为它不再需要了。

[(idx, val) for val, (idx, ch) in enumerate(sorted([(0, 'V'), (1, 'E'), ...], key = lambda x: x[1]), start=1)]
# [(1, 1), (3, 2), (4, 3), (2, 4), (5, 5), (0, 6)]

然后映射第二个元素(我们的值)按第一个元素(原始索引)

排序
map(lambda x: str(x[1]), sorted(replacement_values)

str.join

''.join(that_mapping)

钽哒!