根据字典值获取不同的集合

时间:2019-02-27 06:32:07

标签: python dictionary combinations

我正在解决编码挑战性问题,遇到了需要帮助的地方。

基本上,问题是询问一个人可以输入多少服装而不必完全裸身。请允许我详细说明:

输入:

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'}

谢谢。

3 个答案:

答案 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