【问题标题】:Minimum combinations of elements from multiple lists such that all elements appear at least once来自多个列表的元素的最小组合,使得所有元素至少出现一次
【发布时间】:2019-03-08 14:32:24
【问题描述】:

所以我遇到的问题是:

有多个组,每个组包含多个个人和一个等级。 例如

GroupA = [('Joe', 1), ('Kate', 2), ('Jeff', 1)]
GroupB = [('Sam', 1), ('Jim', 2), ('Stephanie', 2)]
GroupCC = [('Adam', 2), ('David', 1), ('Liz', 1), ('Michael', 2)]
  • 我正在组建多个团队,每个团队只包含一个人,每个团队包含 3 个人。 前任。 ['Kate', 'Sam', 'Adam']

  • 一个人可以属于多个团队,但排名第一的人应该有优先权。如果有多个排名为 1 的人,则应均匀分布。

为了让每个玩家都属于一个团队,我可以组建的最少团队数量是多少?

在这种情况下,显而易见的答案是 4 个团队,因为 listC 的元素最多。这也意味着列表 A 和列表 B 中的个人将被包含两次。我想确保使用两次的人是列表 A 中的 Joe 或 Jeff,以及列表 B 中的 Sam。

【问题讨论】:

  • 鉴于可以将人员分配到多个团队(没有说明限制),那么最少的团队数量不应该总是最长列表的长度吗?
  • 或者这里的问题仅仅是分配,因为我看到的唯一问题是“我可以组建的最少团队数量是多少,这样每个玩家都属于一个团队?”
  • 我不够清楚。我也想知道这些组合是什么。一个随机集就足够了。

标签: python algorithm combinations


【解决方案1】:

首先,让我们将其推广到任意数量的组

GroupA = [('Joe', 1), ('Kate', 2), ('Jeff', 1)]
GroupB = [('Sam', 1), ('Jim', 2), ('Stephanie', 2)]
GroupC = [('Adam', 2), ('David', 1), ('Liz', 1), ('Michael', 2)]
groups = [GroupA, GroupB, GroupC]

然后我们将遍历组,并根据需要重复元素(优先考虑 1)。我们还将去除列表中每个元素的排名。

max_len = max(map(len, groups))

names = []
for group in groups:
    subgroup = list(group)
    if any(rank == 1 for _, rank in group):
        subgroup = list(filter(lambda x:x[1] == 1, group))
    group += subgroup * (max_len - len(group))
    names.append([name for name, _ in group])

现在 names 包含名称列表,名称至少重复多次以匹配最长的组(可能更多,zip 将修剪)。

我们会知道将这些列表压缩在一起,并获得我们的团队。

teams = list(zip(*names))

结果:

>>> print("\n".join(map(str, teams)))
('Joe', 'Sam', 'Adam')
('Kate', 'Jim', 'David')
('Jeff', 'Stephanie', 'Liz')
('Joe', 'Sam', 'Michael')

【讨论】:

  • 太棒了!谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多