来自多个列表的元素的最小组合,使得所有元素至少出现在

2024-06-25 06:10:52 发布

您现在位置:Python中文网/ 问答频道 /正文

所以我的问题是:

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

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的人应该有优先权。如果有多个排名1的人,那么应该平均分配

我能组建的球队的最小数量是多少,这样每个球员都属于一个球队

在本例中,显而易见的答案是4个团队,因为listC拥有最多的元素。这也意味着listA和ListB中的一个人将被包括两次。我想确定两次使用的人是listA的Joe或Jeff,以及listA B的Sam


Tags: sam团队davidjoejeffadam球队lista
1条回答
网友
1楼 · 发布于 2024-06-25 06:10:52

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

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

相关问题 更多 >