Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何将按字母顺序排列的最小字母替换为1,将下一个最小字母替换为2,但不放弃一个字母的多次出现?_Python - Fatal编程技术网

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

Python 如何将按字母顺序排列的最小字母替换为1,将下一个最小字母替换为2,但不放弃一个字母的多次出现?,python,Python,我使用的是Python3,我想编写一个函数,该函数采用所有大写字母的字符串,因此假设s='spine',并给出以下输出'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) d

我使用的是Python3,我想编写一个函数,该函数采用所有大写字母的字符串,因此假设
s='spine'
,并给出以下输出
'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)
def键2:
新=“”
对于ch in s:
acc=0
对于s中的温度:

如果temp一种方法是使用
numpy.argsort
查找顺序,然后查找列组并加入它们:

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

一种方法是使用
numpy.argsort
查找顺序,然后查找列组并将其加入:

>>> s = 'VENEER'
>>> order = np.argsort(list(s))
>>> rank = np.argsort(order) + 1
>>> ''.join(map(str, rank))
'614235'
首先,我们运行
enumerate
,以保存自然排序顺序

enumerate("VENEER") -> [(0, 'V'), (1, 'E'), (2, 'N'), (3, 'E'), (4, 'E'), (5, 'R')]
# this gives us somewhere to RETURN to later.
然后,我们根据第二个元素(按字母顺序)对其进行排序,并再次运行
枚举
,起始值为
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)]
然后根据第一个元素(原始索引)映射第二个元素(我们的值)排序

str.join
it

''.join(that_mapping)
塔达

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

enumerate("VENEER") -> [(0, 'V'), (1, 'E'), (2, 'N'), (3, 'E'), (4, 'E'), (5, 'R')]
# this gives us somewhere to RETURN to later.
然后,我们根据第二个元素(按字母顺序)对其进行排序,并再次运行
枚举
,起始值为
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)]
然后根据第一个元素(原始索引)映射第二个元素(我们的值)排序

str.join
it

''.join(that_mapping)

塔达

注意,用于替换字符串中字符的内置方法采用第三个参数<代码>计数
。您可以利用这一点,只替换每个字母的第一个外观(显然,一旦替换第一个
'E'
,第二个将成为第一个外观,依此类推):

我使用了内置函数并获得了适当的数字来替换字符:

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

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

请注意,用于替换字符串中字符的内置方法采用第三个参数<代码>计数。您可以利用这一点,只替换每个字母的第一个外观(显然,一旦替换第一个
'E'
,第二个将成为第一个外观,依此类推):

我使用了内置函数并获得了适当的数字来替换字符:

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

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

从你的头衔来看,你可能想这样做

>>> 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'

正如@jornsharpe评论的那样,我不需要从你的标题中使用
OrderedDict

,你可能想这样做

>>> 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'
正如@jornsharpe所评论的,我不需要使用
orderedict

您可以使用正则表达式:

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
您可以使用正则表达式:

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

您的用例没有多大意义。我不明白标题如何与您的示例输入/输出匹配。您的用例没有多大意义。我不明白标题如何与您的示例输入/输出匹配。天哪,这比我的答案好得多。@JonClements我认为这是错误的答案,而
key2
目前正在给出操作。如果答案正确,他们就完成了!我的天哪,这比我的答案好多了。@JonClements我认为这是错误的答案,
key2
目前正在给出操作。如果答案正确,他们就完成了!通过
OrderedDict
执行的操作可以简化为
排序(集合)
;集合实际上是一个没有值的字典,不能有重复项。@jornsharpe:
set
不关心列表顺序。所以我需要使用
OrderdDict
。但是,我只是没有注意到。。。谢谢。:)通过
OrderedDict
执行的操作可以简化为
排序(集合)
;集合实际上是一个没有值的字典,不能有重复项。@jornsharpe:
set
不关心列表顺序。所以我需要使用
OrderdDict
。但是,我只是没有注意到。。。谢谢。:)我认为预期输出是
'614235'
我认为预期输出是
'614235'