我在Python中有类似x='0x08h, 0x0ah'
的字符串,希望将其转换为[8,10]
(如无符号整数)。我可以像[int(a[-3:-1],16) for a in x.split(', ')]
那样拆分和索引它,但是有更好的方法将它转换为整数列表吗?
如果我有y='080a'
吗?
编辑(对于加分:)。)什么(理智的)基于字符串的十六进制表示法有python支持,哪些没有?
答案 0 :(得分:2)
在编写解析器之前,你真的必须知道你要解析的模式是什么。
但看起来您的模式是:可选0x
,然后是十六进制数字,然后是可选h
。至少那是我能提出来处理'0x08h'
和'080a'
的最合理的事情。所以:
def parse_hex(s):
return int(s.lstrip('0x').rstrip('h'), 16)
然后:
numbers = [parse_hex(s) for s in x.split(', ')]
当然,您实际上并不需要 来删除0x
前缀,因为Python接受它作为十六进制字符串的一部分,因此您可以将其写为:
def parse_hex(s):
return int(s.rstrip('h'), 16)
但是,如果您更明确,我认为意图更清晰。
从你的编辑:
编辑哪些(理智的)基于字符串的十六进制表示法有python支持,哪些没有?
请参阅int
的文档:
Base-2,-8和-16文字可以选择前缀为0b / 0B,0o / 0O或0x / 0X,与代码中的整数文字一样。
就是这样。 (如果您阅读了段落的其余部分,如果您保证拥有0x/0X
,则您不必明确使用base = 16.但这对您没有帮助,所以你只需要一个句子。)Numeric Types和Numeric literals上的文档详细说明了“与代码中的整数文字一样”;唯一令人惊讶的是,负数不是文字,复数不是文字(但是纯虚数),可以使用非ASCII数字,但文档没有解释如何。
答案 1 :(得分:0)
您还可以使用map
:map(lambda s:int(s.lower().replace('0x','').replace('h',''), 16),x.split(', '))