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