Python 什么';对有限集合中的符号列表进行编码的最简洁的方法是什么?

Python 什么';对有限集合中的符号列表进行编码的最简洁的方法是什么?,python,list,encoding,binary,sequence,Python,List,Encoding,Binary,Sequence,我感兴趣的是用最少的字节数表示有限集合中的符号序列 例如,假设您有一个只包含字符a-z的文本字符串。您可以将它们编码为ascii,因此每个符号(字符)有1个字节。然而,通过这样做,每个字节只能使用256个值中的26个 我已经编写了一个解决方案,似乎效果很好,但我想知道是否有人知道或者可以想出更好的方法 我的方法是将序列视为以n为基数的整数,其中n是符号集的大小+1。例如,如果您的集合或符号,或“字母表”是{a,b,c}(长度3),那么我们将使用基数4。符号被分配了数值,因此{a=>1,b=>2,

我感兴趣的是用最少的字节数表示有限集合中的符号序列

例如,假设您有一个只包含字符a-z的文本字符串。您可以将它们编码为ascii,因此每个符号(字符)有1个字节。然而,通过这样做,每个字节只能使用256个值中的26个

我已经编写了一个解决方案,似乎效果很好,但我想知道是否有人知道或者可以想出更好的方法

我的方法是将序列视为以n为基数的整数,其中n是
符号集的大小+1
。例如,如果您的集合或符号,或“字母表”是
{a,b,c}
(长度3),那么我们将使用基数4。符号被分配了数值,因此
{a=>1,b=>2,c=>3}
。因此,序列
[b,a,c]
被视为基数为4的数字213,十进制为39。这个整数可以用二进制编码,并解码回它的基4表示形式,以检索序列
2,1,3=>[b,a,c]

我的上述Python实现:

所以我的问题是,有没有比我描述的更节省空间的编码有限集合中元素列表的方法?

使用基数n,其中n是符号数(例如,
{a=>0,b=>1,c=>2}
)。如果每个符号出现的可能性相等,则该方法是最佳的。(当然,您还必须存储字符串的长度。顺便说一下,您的实现使用Python字符串;这些绝对不是您能找到的最节省空间的数据结构。)

如果符号的频率不同,并且您知道它们,则可以使用。如果你不知道频率,那就没有了

无论如何,最好的方法取决于应用程序。

使用基数n,其中n是符号数(例如,
{a=>0,b=>1,c=>2}
)。如果每个符号出现的可能性相等,则该方法是最佳的。(当然,您还必须存储字符串的长度。顺便说一下,您的实现使用Python字符串;这些绝对不是您能找到的最节省空间的数据结构。)

如果符号的频率不同,并且您知道它们,则可以使用。如果你不知道频率,那就没有了


无论如何,最好的方法取决于应用程序。

因此,对于26个符号,您将使用基数32?对于26个符号,我将使用基数27。使用的基数为符号数+1。这是因为0不能用作“000”与“0”或“00”相同。参见Petr的答案。你可以用基数26来表示26个符号。我的问题是:你为什么想要这个?这听起来像是一种尝试或学术练习,我不想在代码中使用这两种练习。“000”与“00”或“0”不同。这似乎只是因为您避免了对编码序列的长度进行编码,而是依赖Python整数或字符串来存储结果,而不考虑它们的空间开销(以及它们为什么需要它们)。对于一个更节省空间的方法,我会先阅读算术编码。所以,对于26个符号,你会使用基数32?对于26个符号,我会使用基数27。使用的基数为符号数+1。这是因为0不能用作“000”与“0”或“00”相同。参见Petr的答案。你可以用基数26来表示26个符号。我的问题是:你为什么想要这个?这听起来像是一种尝试或学术练习,我不想在代码中使用这两种练习。“000”与“00”或“0”不同。这似乎只是因为您避免了对编码序列的长度进行编码,而是依赖Python整数或字符串来存储结果,而不考虑它们的空间开销(以及它们为什么需要它们)。对于一个更节省空间的方法,我将从阅读算术编码开始。谢谢,这很有意义。我不担心Python数据结构,因为我只是使用代码提前组装一个文件,这只是我考虑的文件中原始数据的大小。谢谢,这很有意义。我并不担心Python的数据结构,因为我只是使用代码提前组装一个文件,我考虑的只是文件中原始数据的大小。