【问题标题】:Represent and search a list of binary number in python在python中表示和搜索二进制数列表
【发布时间】:2017-06-23 09:23:20
【问题描述】:

如何根据字符串列表表示仅包含二进制数(非整数)的列表:

str_list = ['111111', '1111011', '11110011', '11111011', '111100011', '111110011']
bin_list = [111111, 1111011, 11110011, 11111011, 111100011, 111110011]

从字符串的大小和位不同的角度出发,是否意味着在两个列表中搜索相同元素的时间不同?两个列表的搜索方法是否相同?

【问题讨论】:

  • 搜索方法相同,__eq__ 方法不同(对于整数可能更快)。
  • 我看到了整数,我是不是遗漏了什么?如果你处理浮点数,你可以将字符串转换为浮点数,并检查你从字符串中获得的准确性给出的舍入误差内的等价性。
  • 我同意威廉的观点。除此之外,您的 bin_list 不包含二进制数 - 它只是基数为 10 的整数,仅包含数字 0 和 1。如果要表示二进制数,请使用前缀 0b
  • 每当我使用 0b 前缀时,python 威胁 bin_list 元素作为字符串 bin_list = [bin(0b111111), bin(0b1111011), bin(0b11110011), bin(0b11111011), bin(0b111100011), bin (0b111110011)] 打印类型(bin_list[0])
  • 你应该只使用bin(..) bin_list = [0b11011,0b1101]...元素是ints。

标签: python list search binary


【解决方案1】:

搜索方法是在列表上定义的,在无序列表中搜索的唯一方法是迭代(当然迭代的顺序是任意的,但没有理由将另一个用于另一种类型的数据,尤其是因为您可以将不同类型的对象放在同一个列表中)。

所以列表基本上不知道里面有什么元素,并且像这样遍历列表:

# basic implementation of linear search
def __contains__(self, item):
    for elem in self:
        if item == elem:
            return True
    return False

现在唯一不同的是== 方法(以及底层的__eq__)。确实:可以更有效地计算 int 的相等性,因为通常可以一次比较 32 位或 64 位(因为它通常是在处理器上硬连线的)。这与字符串形成对比,其中一个迭代字符。因此,ints 上的相等检查比strings 上的更快。

最后,您可以在整数上更紧凑地编码二进制数。例如1110(二进制)等价于14。您不必自己计算:正如this answer 所说,您可以简单地编写0b1110,Python 会将其转换为int 14

【讨论】:

  • 事实上,我对复杂性感兴趣,以及我提到的 str_list 和 bin_list 的搜索时间,我认为它们不一样,因为 0b010 != '010' (以大小表示)
  • 正如之前所说,0b010 是一个整数intlong 等)。在这里我们可以进行 64 位(或一次 32 位)的比较。如果整数是有界的(并非总是如此),则比较在恒定时间内完成。否则,它们都是 O(n)n 是字符串/数字的长度。但是由于整数一次可以比较大量的位,所以无论如何与字符串相比有很大的加速。
猜你喜欢
  • 1970-01-01
  • 2017-07-06
  • 1970-01-01
  • 2022-06-19
  • 1970-01-01
  • 2015-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多