我想知道我可以用一组数字建立一个数字的次数:
possible_numbers = 1, 2, 4, 8, 16
如果我想要23号,我需要
1x 16
0x 8
1x 4
1x 2
1x 1
Python中是否有内置函数来执行此操作?
编辑:数字固定为1,2,4,8,16,32,64,128。可以进行多种选择。
由于没有功能构建,我会自己编写代码。
答案 0 :(得分:11)
假设可能的数字总是2的幂,你基本上想要将数字转换为二进制格式。使用内置的bin function:
可以轻松完成此操作>>> mylist = [int(x) for x in bin(23)[2:]]
>>> print mylist
[1, 0, 1, 1, 1]
要获得与您在问题中显示的输出完全相同的输出:
>>> for i, j in enumerate(mylist):
... print '%ix %i' % (j, 2**(len(mylist)-i-1))
...
1x 16
0x 8
1x 4
1x 2
1x 1
答案 1 :(得分:3)
假设您的数字不限于2的幂,此解决方案应该有效。它绝对没有抛光或效率,但它确实有效。
#!/usr/bin/env python
import sys
def factors(desired, numbers):
if desired == 0:
return []
elif desired < 0:
return None
for number in sorted(numbers, reverse=True):
f = factors(desired - number, numbers)
if f is not None:
f.append(number)
return f
if __name__ == "__main__":
n = int(sys.argv[1])
possibles = map(int, sys.argv[2].split())
f = factors(n, possibles)
print f
for i in sorted(possibles, reverse=True):
print "{0}x {1}".format(f.count(i), i)
以下是一些例子:
$ python test.py 23 "1 2 4 8 16"
[1, 2, 4, 16]
1x 16
0x 8
1x 4
1x 2
1x 1
$ python test.py 23 "1 2 5 8 16"
[2, 5, 16]
1x 16
0x 8
1x 5
1x 2
0x 1
$ python test.py 23 "1 2 3 8 16"
[1, 3, 3, 16]
1x 16
0x 8
2x 3
0x 2
1x 1
$ python test.py 23 "1 2 3 8 17"
[3, 3, 17]
1x 17
0x 8
2x 3
0x 2
0x 1
答案 2 :(得分:2)
如果不允许重复,那么使用powersets(以及来自http://rosettacode.org/wiki/Power_set#Python的一个很好的powerset功能)有一种巧妙的方式:
def list_powerset(lst):
return reduce(lambda result, x: result + [subset + [x] for subset in result], lst, [[]])
def powerset(s):
return frozenset(map(frozenset, list_powerset(list(s))))
def valid_combos(num, lst):
return filter(lambda x: sum(x) == num, powerset(lst))
仅当数字只出现一次时才有效,但我仍然认为这是一个有趣的解决方案。 :)