Zax*_*axR 7 python performance dictionary python-3.x
我有以下词典:
groups = {"group 1": [1, 2, 3, 4],
"group 2": [5, 6, 7, 8],
"group 3": [9, 10, 11, 12],
"group 4": [13, 14]}
Run Code Online (Sandbox Code Playgroud)
当组的长度小于最小大小(group_size=4)时,我想将成员重新分配给其他组.在这种情况下的结果将是这样的:
groups = {"group 1": [1, 2, 3, 4, 13],
"group 2": [5, 6, 7, 8, 14],
"group 3": [9, 10, 11, 12]}
Run Code Online (Sandbox Code Playgroud)
我有以下代码,它可以工作,但效率低于我想要的:
# 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())
Run Code Online (Sandbox Code Playgroud)
重要说明:组的真实成员是字符串,而不是整数.
有没有更好的方法来重新分配字典值列表?
您的解决方案很好,但您可以将弹出和重新分配逻辑结合使用itertools.cycle.
from itertools import cycle
for k in list(groups.keys()):
if len(groups[k]) < group_size:
for v, k_ in zip(groups.pop(k), cycle(groups.keys())):
groups[k_].append(v)
Run Code Online (Sandbox Code Playgroud)
我们的想法是通过密钥循环来平等地重新分配数据.它在每次迭代时确定一个组是否超过阈值.如果一个组有效,那么稍后(通过重新分配)增加它将永远不会使它低于阈值.但是,如果从另一个已删除的组向其添加值,则最初低于阈值的组(但在将来的迭代中直到稍后才会到达)可能会变为有效.如果没有发生,那么它将被删除,并且其数据将在未来的迭代中重新分配.
请记住,最初计划删除的组现在可能在重新分发后变为有效,因此我们的解决方案在某些输入的输出方面会有所不同.
print(groups)
{'group 1': [1, 2, 3, 4, 13],
'group 2': [5, 6, 7, 8, 14],
'group 3': [9, 10, 11, 12]}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
81 次 |
| 最近记录: |