我正在使用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
不包含重复项,则代码可以正常运行。
我坚持如何编辑代码以获得开头所述的输出。
答案 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
我已使用内置函数sorted
和enumerate
来获取替换字符的相应数字:
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)
钽哒!