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

2024-06-16 11:34:43 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我最近跳转到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,这段代码会导致KeyError。对于python2.7,这一点都没有问题。在

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

奇怪的是,python会产生同样的代码。在

目前,我的乐队通过以下方式来帮助我们:

^{pr2}$

有人能不能试着复制这个或者告诉我哪里出错了?在


Tags: 数据项目代码infordatabyte事情
1条回答
网友
1楼 · 发布于 2024-06-16 11:34:43

因为在中,二进制字符串的元素是ints。在

事实上:

>>> type(data[0])
<class 'int'>

这也是在"What's New In Python 3.0" documentation中指定的。在

因此,您可以通过构建字典来解决问题,例如:

^{pr2}$

或者你可以用相反的方法来做:

^{3}$

但更优雅的解决方案是使用计数器:

from collections import Counter

result = Counter(data)

从而产生:

>>> Counter(data)
Counter({16: 1, 1: 1, 86: 1, 25: 1, 73: 1, 71: 1, 78: 1, 0: 1})

Counterdict的一个子类,因此计数器支持所有字典操作。在

如果您希望计数器包含string值,您可以这样做:

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})

注意,如果您在计数器中查询一个不存在的键,它将返回0。所以你也节省了内存,可以这么说,因为你不必对所有256个值都有计数。在

相关问题 更多 >