你可以用
list comprehension
为了掩盖事实,你真的
做
需要使用嵌套
for
循环以通用方式解决此问题(避免可能需要硬编码
很大
数量(非嵌套的):
from itertools import chain, combinations
ones = [1, 1, 1] # 3 coins of value 1
twos = [2, 2] # 2 coins of value 2
fives = [5, 5, 5] # 3 coins of value 5
all_coins = ones + twos + fives
target = 10
combos = set()
for combo in chain.from_iterable(combinations(all_coins, length)
for length in range(1, len(all_coins)+1)):
if sum(combo) == target:
combos.add(combo)
print(combos)
通过添加一个助手函数,可以以更可读的方式打印结果:
from itertools import groupby
denomination = {1: 'ones', 2: 'twos', 5: 'fives'} # Names of values.
def ppcombo(combo):
""" Pretty-print a combination of values. """
groups, uniquekeys = [], []
combo = sorted(combo)
for key, group in groupby(combo):
groups.append(list(group))
uniquekeys.append(key)
counts = {key: len(group) for key, group in zip(uniquekeys, groups)}
print(' + '.join(f'{count}*{denomination[value]}' for value, count in counts.items()))
print('combos:', combos)
print()
for combo in combos:
ppcombo(combo)
样本输出:
combos: {(1, 2, 2, 5), (5, 5), (1, 1, 1, 2, 5)}
1*ones + 2*twos + 1*fives
2*fives
3*ones + 1*twos + 1*fives