给你个字符串,包含‘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自帶的計算器驗証通過: