我正在解决编码挑战性问题,遇到了需要帮助的地方。
基本上,问题是询问一个人可以输入多少服装而不必完全裸身。请允许我详细说明:
输入:
hat headgear
sunglasses eyewear
cap headgear
输出:
5
在此示例中输出为5的原因是,因为您可能的组合为(hat)
,(sunglasses)
,(cap)
,(hat, sunglasses)
,(cap, sunglasses)
只能穿着每个类别的一件商品。
我最初的想法是根据每个项目的值对它们进行分类,关键是特定项目,然后使用itertools.product
找出有多少种可能的组合。
是否可以从[hat, cap]
中提取[sunglasses]
,{'hat': 'headgear', 'cap': 'headgear', 'sunglasses': 'eyewear'}
?
谢谢。
答案 0 :(得分:2)
我认为,您正在艰难地生活。 如果您不需要了解所有服装,则可以为其设置数字:您可以在帽子上戴帽子,帽子或不戴任何帽子,所以让headgear = 3,eyegear为2(太阳镜或不戴眼镜),并且以此类推。为此,您可以仅从字符串字典开始,带字符串的int是可穿戴类型,而int是元素数加1。 最后,您可以通过遍历字典将数字相乘,然后将1完全遮盖掉
答案 1 :(得分:1)
我将创建另一本词典,其中服装类型为键,并且所有类型的服装列表均为值:
clothes = {}
for wearable, clothing_type in your_dict:
if clothing_type not in clothes:
clothes[clothing_type] = ['']
clothes[clothing_type].append(wearable)
# now clothes is {'headgear': ['', 'hat', 'cap'], 'eyewear': ['', 'sunglasses']}
如果只希望数字5,则可以将每个列表的长度乘以1:
possible_combinations = 1
for clothing_type, wearables in clothes:
possible_combinations *= len(wearables)
possible_combinations -= 1
# 5
如果您想要实际的组合,itertools
是一个很好的主意:
combinations = [list(c) for c in itertools.product(*clothes.values())]
for combination in combinations:
combination.remove('')
combinations = [c for c in combinations if c]
print(combinations)
输出:
[['sunglasses'], ['hat'], ['hat', 'sunglasses'], ['cap'], ['cap', 'sunglasses']]
答案 2 :(得分:1)
您可以先将您的项目存储在字典中,其中的键代表项目的类型,值代表每种类型的特定项目的列表。例如:
gear = {
'headgear': ['hat', 'cap', 'bandana'],
'eyewear': ['sunglasses'],
'footwear': ['socks', 'shoes']
}
然后,您可以按照最初的方法进行操作,但可以找到每种类型长度为1或更大的组合(例如(headgear,), (headgear, eyewear)
等)。这样一来,您就可以计算每种齿轮组合可达到的特定组合数量,您可以将这些数字累加起来。
例如,对于以上词典中的齿轮组合('headgear', 'eyewear')
,特定组合的总数为len(gear['headgear']) * len(gear['eyewear'])
,即3
。对于组合('headgear', 'eyewear', 'footwear')
,它是3 * 1 * 2 = 6
。我们的最终结果是组合的所有可能长度大于1的所有这些数字的总和。这给出了以下代码:
from itertools import combinations
from functools import reduce
res = 0
for num_gears in range(1, len(gear) + 1):
for gear_combination in combinations(gear.keys(), num_gears):
res += reduce(lambda a, c: a * c, [len(gear[c]) for c in gear_combination])
print(res) # 23