Python3:迭代二进制字符串将字符转换为整数

Python3:迭代二进制字符串将字符转换为整数,python,string,python-2.7,python-3.x,iteration,python-3,Python,String,Python 2.7,Python 3.x,Iteration,Python 3,我觉得我错过了一些琐碎的事情: 我最近跳转到Python3(在Eclipse中使用PyDev)。 我有一个计算熵值的项目,包含以下代码: data = b'NVGI\x19\x01\x10\x00' seen = dict(((chr(x), 0) for x in range(0,256))) for byte in data: seen[byte]+=1 数据中的二进制字符串要长得多,但这足以用于演示目的 对于python3,此代码会导致一个keyrerror。对于python2.

我觉得我错过了一些琐碎的事情:

我最近跳转到Python3(在Eclipse中使用PyDev)。
我有一个计算熵值的项目,包含以下代码:

data = b'NVGI\x19\x01\x10\x00'
seen = dict(((chr(x), 0) for x in range(0,256)))
for byte in data:
    seen[byte]+=1
数据中的二进制字符串要长得多,但这足以用于演示目的

对于python3,此代码会导致一个keyrerror。对于python2.7,这一点都没有问题

这是因为在数据上迭代会返回一个整数(本例中为78),而seen则需要一个字符“N”

奇怪的是,在python2.7中,相同的代码将生成预期的字符“N”

目前,我通过以下方式帮助实现了这一点:

seen[ord(byte)] += 1
有人能试着复制一下吗?或者告诉我哪里出错了?

因为二进制字符串的元素是
int
s

事实上:

>>> type(data[0])
<class 'int'>
计数器
dict
的子类,因此计数器上支持所有字典操作

如果您希望计数器包含
str
ing值,可以按如下方式执行:

result = Counter(chr(x) for x in data)
请注意,如果查询不存在密钥的计数器,它将返回
0
。因此,也可以说您节省了内存,因为您不必对所有256个值进行计数。

因为在中,二进制字符串的元素是
int
s

事实上:

>>> type(data[0])
<class 'int'>
计数器
dict
的子类,因此计数器上支持所有字典操作

如果您希望计数器包含
str
ing值,可以按如下方式执行:

result = Counter(chr(x) for x in data)

请注意,如果查询不存在密钥的计数器,它将返回
0
。因此,可以说,您还节省了内存,因为您不必对所有256个值都进行计数。

为什么不使用
计数器
?您希望在Python 2和3中运行相同的代码?即使使用计数器,我也会被迫执行
seen[data[counter]
where
data[counter]
仍然返回整数而不是和字符。几乎没有记录:为什么不使用
计数器
?您希望在Python 2和3中运行相同的代码?即使使用计数器,我也会被迫执行
seen[data[counter]
where
data[counter]
仍然返回整数而不是和字符。几乎没有文档记录:谢谢,非常有用。也许可以在文档中添加@Yann评论的链接@阿雷古马:这的确是个好建议。修改。谢谢,非常有用。也许可以在文档中添加@Yann评论的链接@阿雷古马:这的确是个好建议。被改进的。
>>> Counter(data)
Counter({16: 1, 1: 1, 86: 1, 25: 1, 73: 1, 71: 1, 78: 1, 0: 1})
result = Counter(chr(x) for x in data)
>>> Counter(chr(x) for x in data)
Counter({'\x00': 1, 'G': 1, 'I': 1, '\x01': 1, 'V': 1, 'N': 1, '\x10': 1, '\x19': 1})