我使用的程序使用4个字符的输入字符串来保存4个不同的标志(每个标志代表一个输入选项)。然后,将这些字符“打包”为一个整数,表示为输入字符的总和。
为了我们的目的,请使用以下编码:K=8; E=4; N=2; W=1
如果用户输入“ KENW”,则保存的整数为=8+4+2+1=15
。
如果用户输入“ KW”,则保存的整数为=8+1=9
。
我想将保存的整数反向工程为原始的4个字符串(顺序和大小写无关紧要)。换句话说,如果整数值为15,我想得到“ KENW”,如果整数值为9,我想得到“ KW”。
我将一些代码组合在一起以执行此操作(请参见下文)。它将整数转换为二进制值字符串,然后对每个数字的二进制值进行测试以从固定列表映射到各个字符标志。
这是一个好方法吗?或者,还有更好的方法? (我喜欢它,因为我了解它。)
注释(5/19/2019):以下代码已修改,以在def ()
中移动二进制转换和按位字符串映射,以提高可读性(和实现)。此外,def支持修订后的format()
的任何长度的字符串。
def decode_flags (iflag, flag_str):
# iflag = integer input; flag_str= character mapping string
xf_b = format(iflag, '0{}b'.format(len(flag_str)) )
xflag_str= ''
for pos in range(len(xf_b)):
if ( int(xf_b[pos]) ) : # 1 is True, 0 is False in Python
xflag_str+= flag_str[pos]
return xflag_str
# Encoding:
# K=8; E=4; N=2; W=1
flag_str = 'KENW'
test_list = [1, 2, 4, 8, 10, 14, 15]
for xf in test_list:
print ('\nxf=%d' % xf)
xflag_str = decode_flags (xf, flag_str)
print('XFLAG=', xflag_str)
编辑:根据评论,enum IntFlag
很有趣。
我开始编码(如下),并且可以从字符串创建整数标志。 但是,这不是我的问题。我需要从整数值(下面的代码中的“ WEN”为7)中提取原始字符,并且不知道该怎么做。提供的链接都没有显示解决方案,我的SO搜索未找到任何答案。
from enum import IntFlag
class Xflag(IntFlag):
K = 8
E = 4
N = 2
W = 1
if __name__ == '__main__' :
for xf in (Xflag):
print (xf.name, xf.value)
test_flag = 'WEN'
iflag = 0
for xf in (Xflag):
if xf.name in test_flag:
iflag += xf.value
print (test_flag, iflag)