我有几个标记:
None = 0
HR = 1
HD = 2,
DT = 4,
Fl = 8
..
我想创建一个函数,输入一个特定的标志,比如:6。
返回的应该是HDDT,因为2 | 4 = 6。 也可能组合3个或更多的标志,或只有一个。 例如:7 = 1 | 2 | 4 => HRHDDT。
如何根据标志值返回连接的字符串?
在我的情况下,枚举有更多的条目,这将使简单的if语句非常不舒适,因为我必须覆盖数百种情况。
有没有什么聪明的解决方案?
我有几个标记:
None = 0
HR = 1
HD = 2,
DT = 4,
Fl = 8
..
假设我们有一个包含二的幂次方的列表:
flags = ['HR','HD','DT','Fl']
def power2():
i = 1
while True:
yield i
i *= 2
def obtain_flag(val):
if val:
return ''.join([f for f,i in zip(flags,power2()) if i&val])
else:
return None
return None
是不必要的:它是映射到零的标志。
或者,如果你想要一个标志列表(在这种情况下,标志可以是任何内容):
def obtain_flag(val):
if val:
return [f for f,i in zip(flags,power2()) if i&val]
>>> obtain_flag(6)
'HDDT'
>>> obtain_flag(7)
'HRHDDT'
>>> obtain_flag(0) # returns None, but None is not printed
>>> obtain_flag(1)
'HR'
>>> obtain_flag(2)
'HD'
>>> obtain_flag(3)
'HRHD'
>>> obtain_flag(4)
'DT'
enumerate
和 1<<n
来避免需要 power2
辅助函数呢? - Davis Herringdict
的形式:flags = {1:'HR', 2:'HD', 4:'DT', 8:'FL'}
通过位运算符 and
按位与您的数字和标志以检索字符串:
def get_flags(num):
if num:
return ''.join(flags[x] for x in flags if x & num)
return None
>>> get_flags(6)
'HDDT'
return None
这一行是多余的,但仍然+1。 - t.m.adam