以递增顺序打印数字作为2的幂的总和

时间:2015-01-14 06:01:38

标签: python python-2.7 optimization

我试图打印出十进制整数(非负数)作为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'])

1 个答案:

答案 0 :(得分:4)

将这种情况分散到muplitple行更好,并且在列表理解中使用和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(...)