【问题标题】:Printing a number as a sum of powers of 2 in increasing order按升序打印一个数字作为 2 的幂的和
【发布时间】:2015-01-14 14:23:24
【问题描述】:

我正在尝试打印一个十进制整数(非负)作为 2 的幂的总和,即对于输入 10,它应该打印不带引号的“2 8”。我已经写了这段代码,但是谁能给我一个单行代码。

n = bin(int(raw_input()))[-1:1:-1]
print (' ').join([str((int(n[j])+1)**j) for j in xrange(len(n)) if n[j] == '1'])

【问题讨论】:

  • 我没有得到,怎么从 10 变成 28??
  • 你在这里尝试不清楚
  • OP 正在尝试获取构成整数的二进制组件。所以2+8=101+2+8=111+256=257等等……

标签: python python-2.7 optimization


【解决方案1】:

最好将它分布在多行中,并在列表理解中使用和input 隐藏代码正在执行的关键信息。

最终,你要求做的并不漂亮,但无论如何都是这样:

print (' ').join([str(2**i) for i,j in enumerate(bin(int(raw_input()))[-1:1:-1]) if j == '1'])

打印得很漂亮:

print ' '.join(
    [str(2**i)
     for i,j in enumerate(
         bin(int(raw_input()))[-1:1:-1]
       )
      if j == '1']
  )

注意事项:

  • int(n[j])+1) 将始终为 2,因为您仅在 j 为 1 时进行迭代。
  • enumerate 返回一个包含索引和值的元组列表,因此您不需要存储n,并且可以直接针对j 进行测试。
  • Python 可以遍历项目列表而无需按索引获取它们,这是[list[i]**2 for i in len(list)][i**2 for i in list] 之间的区别
  • 你不需要在字符串周围加上括号,这样你可以节省一些空间:

    " ".join(...)
    

    而不是这个:

    (" ").join(...)
    

【讨论】:

  • 你可以把它变成一个生成器表达式而不是列表理解
猜你喜欢
  • 2023-02-01
  • 2010-09-17
  • 1970-01-01
  • 2016-02-24
  • 1970-01-01
  • 1970-01-01
  • 2023-01-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多