为了账号安全,请及时绑定邮箱和手机立即绑定

来自多个列表的元素的最小组合,以便所有元素至少出现一次

来自多个列表的元素的最小组合,以便所有元素至少出现一次

噜噜哒 2021-11-30 10:24:30
所以我遇到的问题是:有多个组,每个组包含多个个人以及一个等级。例如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。
查看完整描述

1 回答

?
慕后森

TA贡献1802条经验 获得超5个赞

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


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])

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


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


teams = list(zip(*names))

结果:


>>> print("\n".join(map(str, teams)))

('Joe', 'Sam', 'Adam')

('Kate', 'Jim', 'David')

('Jeff', 'Stephanie', 'Liz')

('Joe', 'Sam', 'Michael')


查看完整回答
反对 回复 2021-11-30
  • 1 回答
  • 0 关注
  • 159 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信