Loops 嵌套循环的理解
我必须找出有多少种不同的排列方式可以使用三枚硬币创造65枚硬币的总和。 给定列表:Loops 嵌套循环的理解,loops,nested,permutation,Loops,Nested,Permutation,我必须找出有多少种不同的排列方式可以使用三枚硬币创造65枚硬币的总和。 给定列表: 硬币=[200,100,50,20,10,5] 到目前为止,我所尝试的: len(set([x + y + z for x in coins for y in coins for z in coins if (x+y+z)%65 == 0])) 我想我应该使用导入功能 例如,使用随机列表: import itertools len(list(itertools.permutations([1,2,3]))
- 硬币=[200,100,50,20,10,5]
len(set([x + y + z for x in coins for y in coins for z in coins if (x+y+z)%65 == 0]))
我想我应该使用导入功能
例如,使用随机列表:
import itertools
len(list(itertools.permutations([1,2,3])))
从技术上讲,嵌套循环方法实际上并不能解决这个问题,因为它会包含目标和的倍数,从而导致计数过多。要解决此问题,您只需计算正好为65的数字——请参见此处:
coins = [200, 100, 50, 20, 10, 5]
target = 65
original = len(set([x + y + z for x in coins for y in coins for z in coins if (x + y + z) % 65 == 0]))
print('Original:', original) # prints 3
new = list(set([x + y + z for x in coins for y in coins for z in coins if (x + y + z) % target == 0])).count(target)
print('Ignoring multiples of 65:', new) # prints 1
现在,关于你的第二点,这是让人有点困惑的地方。上面实际上计算了组合的数量,而不是排列的数量。相比之下,您最初的声明是关于排列的数量,您使用itertools
的示例也使用排列。我不确定您的确切意图是什么,但itertools
为这两种方法提供了一种方法
但是,示例len(list(itertools.permutations([1,2,3]))
将返回所有置换的计数,而不仅仅是那些与目标值相加的置换。因此,如果您使用len(list(itertools.permutations(coins))
,则默认情况下,排列的长度为6——您必须为目标长度为3的itertools.permutations
提供第二个参数
因此,以下内容应适用于您:
import itertools
perms = list(itertools.permutations(coins, 3)) # permutations of length 3
total_perms = len([perm for perm in perms if sum(perm) == target]) # count only those which sum to 65
print('Total permutations:', total_perms) # prints 6
但是,如果您确实对组合的数量感兴趣——这是原始嵌套循环方法所做的,那么您必须使用itertools.combinations
:
combs = list(itertools.combinations(coins, 3)) # combinations of length 3
total_combs = len([comb for comb in combs if sum(comb) == target]) # count only those which sum to 65
print('Total combinations:', total_combs) # prints 1
祝你好运