我有一个字典列表,按给定的键/值“ weight”排序。例如,我想将它们分组在一起,以使权重永远不会超过20,并且每个列表的长度都不应超过5,但每个dict组的距离应尽可能接近。输入看起来像这样:
[{'name': 'A', 'weight': 1},
{'name': 'B', 'weight': 1},
{'name': 'C', 'weight': 1},
{'name': 'D', 'weight': 1},
{'name': 'E', 'weight': 1},
{'name': 'F', 'weight': 1},
{'name': 'G', 'weight': 5},
{'name': 'H', 'weight': 5},
{'name': 'I', 'weight': 5},
{'name': 'J', 'weight': 10},
{'name': 'K', 'weight': 10},
{'name': 'L', 'weight': 20},
{'name': 'M', 'weight': 20},
]
输出应如下所示:
[
[
{'name': 'A', 'weight': 1},
{'name': 'B', 'weight': 1},
{'name': 'C', 'weight': 1},
{'name': 'D', 'weight': 1},
{'name': 'E', 'weight': 1}
],
[
{'name': 'F', 'weight': 1},
{'name': 'G', 'weight': 5},
{'name': 'H', 'weight': 5},
{'name': 'I', 'weight': 5}
],
[
{'name': 'J', 'weight': 10},
{'name': 'K', 'weight': 10}
],
[
{'name': 'L', 'weight': 20}
],
[
{'name': 'M', 'weight': 20}
]
]
另一个问题是我希望能够限制最大数量
我弄弄了一些列表理解,
out = [dict_list[i:i + 5] for i in range(0, len(dict_list), 5)]
可以让我除以5,但是我在弄清楚如何加权列表方面遇到困难。
答案 0 :(得分:2)
您可以继续在for
循环中将输入列表中的dict追加到输出列表的最后一个子列表,但是如果输出列表为空(权重之和),则创建一个新的子列表。最后一个子列表加上当前项超过20,或者最后一个子列表的大小已经为5。这将在时间复杂度上仅花费 O(n):
output = []
for item in lst:
if not output or last_sum + item['weight'] > 20 or len(output[-1]) == 5:
output.append([])
last_sum = 0
output[-1].append(item)
last_sum += item['weight']
output
变为:
[[{'name': 'A', 'weight': 1},
{'name': 'B', 'weight': 1},
{'name': 'C', 'weight': 1},
{'name': 'D', 'weight': 1},
{'name': 'E', 'weight': 1}],
[{'name': 'F', 'weight': 1},
{'name': 'G', 'weight': 5},
{'name': 'H', 'weight': 5},
{'name': 'I', 'weight': 5}],
[{'name': 'J', 'weight': 10},
{'name': 'K', 'weight': 10}],
[{'name': 'L', 'weight': 20}],
[{'name': 'M', 'weight': 20}]]