Python解答一个字符串的问题

给你个字符串,包含‘0’‘9’,uz,U~Z各字符组成的十六进制形式的字符串(u/U对应十进制的10,以此类推),保持所有非数字部份位置不变,把其中的数字按从小到大排序后,将它转化为无符号十进制数字。假设:字符串包含的字符个数不超过8个。


mystr = input('请输入0-9,u-z,U-Z组成的16进制字符串:')
position = []
mynum = []

for i in range(len(mystr)):
    if mystr[i] in "0 1 2 3 4 5 6 7 8 9".split():
        position.append(i)
        mynum.append(int(mystr[i]))
mynum.sort()

for i in range(len(position)):
    mystr = mystr[:position[i]] + str(mynum[i]) + mystr[position[i]+1:]

print('保持非数字部分位置不变,数字升序排列后的新字符串为:', mystr)

newnum = 0
for i in range(len(mystr)):
    if mystr[i] in "0 1 2 3 4 5 6 7 8 9".split():
        newnum += int(mystr[i]) * 16**(len(mystr)-i-1)
    else:
        newnum += (ord(mystr[i].upper()) - 75) * 16**(len(mystr)-i-1)

print('转换为10进制数字为:',newnum)

我的思路是:
1.抽取所有數字(digit)並記錄它們的索引值;
2.然後排序數字, 並按索引值插入(準確來說是賦值)回字符串;
3.最後按u-z對應的10-15, 求值

下面是實現代碼, 有很大的优化空間, 拋磚引玉:

# 獲取原字符串
dict_hex = {'u': 10, 'v': 11, 'w': 12, 'x': 13, 'y': 14, 'z': 15}
src_str = input('input your number(in hex):').lower()  # 轉換爲小寫
digit_list = []  # store digit
index_list = []  # store index
dest_str = []  # store sorted src_str

# 遍歷輸入的字符串, 抽取數字和索引值
for i in range(len(src_str)):
    if src_str[i].isdigit():
        # 記錄數字和索引值
        digit_list.append(src_str[i])
        index_list.append(i)
        dest_str.append('')
    else:
        dest_str.append(src_str[i])

# 排序數字
digit_list.sort()
# 按索引值插入, 生成合規的新字符串
for i in range(len(dest_str)):
    if i == index_list[0]:
        dest_str[i] = digit_list.pop(0)
        index_list.pop(0)

# 求值, 倒序求值
dec_num = 0
for i in range(len(dest_str)):
    if dest_str[-(i+1)].isdigit():
        dec_num += eval(dest_str[-(i+1)])*16**i
    else:
        dec_num += dict_hex[dest_str[-(i+1)]]*16**i

print(f"""src_str(in hex): {src_str}
dest_str(in hex): {''.join(dest_str)}
dec_num(in dec): {dec_num}""")

測試無誤, 重排字符順序並求值, 用Win10自帶的計算器驗証通過:

img