【发布时间】:2018-10-24 17:06:09
【问题描述】:
我有以下字典:
groups = {"group 1": [1, 2, 3, 4],
"group 2": [5, 6, 7, 8],
"group 3": [9, 10, 11, 12],
"group 4": [13, 14]}
当组的长度小于最小大小 (group_size=4) 时,我想将成员重新分配到其他组。在这种情况下,结果将类似于:
groups = {"group 1": [1, 2, 3, 4, 13],
"group 2": [5, 6, 7, 8, 14],
"group 3": [9, 10, 11, 12]}
我有以下代码,它有效,但效率低于我想要的:
# Identify small groups
small_groups = []
for group_name, group_members in groups.items():
if len(group_members) < group_size:
small_groups.append(group_name)
# Redistribute members of small groups to the larger groups
to_redistribute = []
for group_name in small_groups:
to_redistribute.extend(groups.pop(group_name))
for group_name, group_members in groups.items():
if not to_redistribute:
break
group_members.append(to_redistribute.pop())
重要提示:组的真正成员是字符串,而不是整数。
有没有更好的方法来重新分配字典值列表?
【问题讨论】:
-
如果只有 5 个数字怎么办,我的意思是组大小小于 4 并且总值计数只有 5
-
为什么效率低?
-
抱歉,修复并编辑了我的答案。
-
如果 minimum_size 与组数相比很大,您可以通过将要分发的值分组到块中来提高效率(例如一次发牌而不是发牌)一次)。但是,如果它的大小与您的示例相同,则更有可能减慢速度而不是加快速度。
-
@Kalyan - group_size 实际上是基于我将人们分成四分位数并从每四分位数 1 人组成的组。但是,因为我的人数不一定是 4 的倍数,所以并非所有组的人数都为 4。如果人数少于 4 人,则有其他逻辑可以处理。
标签: python python-3.x performance dictionary