0

我有类似x='0x08h, 0x0ah'Python 的字符串,想将其转换为[8,10](如无符号整数)。我可以像拆分和索引它一样[int(a[-3:-1],16) for a in x.split(', ')],但是有没有更好的方法将它转换为整数列表?

如果我有这有关系y='080a'吗?

编辑(加分:)。)什么(理智的)基于字符串的十六进制表示法支持python,哪些不支持?

4

2 回答 2

2

在编写解析器之前,您确实必须知道要解析的模式是什么。

但看起来您的模式是: optional 0x,然后是十六进制数字,然后是 optional 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。但这对您没有帮助,因此您只需要一句话。)有关数字类型数字文字的文档详细说明了“与代码中的整数文字一样”的内容;唯一令人惊讶的是负数不是文字,复数不是文字(但纯虚数是),并且可以使用非ASCII数字,但文档没有解释如何使用。

于 2013-10-02T18:43:17.030 回答
0

您还可以使用mapmap(lambda s:int(s.lower().replace('0x','').replace('h',''), 16),x.split(', '))

于 2013-10-02T18:45:34.193 回答