【问题标题】:Convert elements of a list into binary将列表的元素转换为二进制
【发布时间】:2016-12-20 11:36:10
【问题描述】:

假设我有一个列表:

lst = [0, 1, 0, 0]

如何让 python 将此列表解释为二进制数 0100,以便2*(0100) 给我01000

我能想到的唯一方法是首先创建一个函数,将“二进制”元素转换为相应的整数(以 10 为底),然后使用 bin() 函数..

有没有更好的办法?

【问题讨论】:

  • int 已经是二进制表示。为了打印到屏幕上,文字及其打印表示转换为十进制。但是您可以对它们进行按位操作,因为底层表示是二进制的。如果您想使用二进制文字,请在您的解释器中尝试0b1000。现在试试 12 * 0b1000。只有当您想显示二进制表示时,您才需要显式使用bin()

标签: python python-3.x binary


【解决方案1】:

你可以像这样使用bitwise operators

>>> lst = [0, 1, 0, 0]
 >>> bin(int(''.join(map(str, lst)), 2) << 1)
'0b1000'

【讨论】:

    【解决方案2】:

    接受的答案,加入一个字符串,并不是最快的。

    import random
    
    lst = [int(i < 50) for i in random.choices(range(100), k=100)]
    
    
    def join_chars(digits): 
        return int(''.join(str(i) for i in digits), 2)    
    
    %timeit join_chars(lst) 
    13.1 µs ± 450 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
    
    
    def sum_digits(digits): 
        return sum(c << i for i, c in enumerate(digits)) 
    
    %timeit sum_digits(lst)                                                                                                                                                                                                 
    5.99 µs ± 65.5 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
    

    所以位碰撞sum_digits() 首先是 x2 的因子!

    【讨论】:

      【解决方案3】:

      这不是花哨的单线,而是简单快捷。

      lst = [0,1,1,0]
      
      num = 0
      for b in lst:
          num = 2 * num + b
      print(num) # 6
      

      【讨论】:

        【解决方案4】:

        理解的方法略有不同(我希望它对某人有所帮助)

        arr =[192, 168, 0, 1]
        arr_s = [bin(i)[2:].zfill(8) for i in ar]
        num = int(''.join(arr_s), 2)
        

        相同,但顺序相反(也适用于 lambdas 的单行代码)

        arr = [24, 85, 0]
        num = int(''.join( [bin(i)[2:].zfill(8) for i in arr[::-1]] ), 2)
        

        使用按位和归约:

        reduce ((lambda x,y: (x<<8)|y), arr[::-1]) 
        

        【讨论】:

          【解决方案5】:

          您可以使用此代码连接列表元素:

          x=[0, 1, 0, 0]
          b=''.join(map(str,x))
          print(b)
          

          输出:

          C:\python\prog>python trying.py
          
          0100
          

          【讨论】:

            【解决方案6】:

            在 Jupyter 中:-

            lst = [4,5,7,1,2]
            bin(int(''.join(map(str, lst)))<<1)
            

            o/p:- '0b10110010100100000'

            在 Python Shell 中:-

            >>> lst =[4,5,7,1,2]
            >>> bin(int(''.join(map(str, lst)))<<1)
            

            o/p:- '0b10110010100100000'

            【讨论】:

            • 很遗憾答案不符合提问条件:列表中必须填写代表二进制值的“0”和“1”。
            【解决方案7】:

            你可以试试:

            l = [0, 0, 1, 0]
            num = int(''.join(str(x) for x in l), base=2)
            

            【讨论】:

              猜你喜欢
              • 2021-07-12
              • 2013-05-28
              • 2023-02-03
              • 2018-10-26
              • 1970-01-01
              • 1970-01-01
              • 2012-10-16
              • 2021-01-31
              • 2022-01-06
              相关资源
              最近更新 更多