[英]Split list of dictionaries into list of lists with list length based on a key value pair inside the dictionary
我有一個字典列表,按給定的鍵/值“權重”排序。 例如,我想將它們組合在一起,以便權重永遠不會超過 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},
]
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}
]
]
另一個問題是我希望能夠限制最大數量
我擺弄了一些列表理解,我有out = [dict_list[i:i + 5] for i in range(0, len(dict_list), 5)]
允許我除以 5,但我有難以弄清楚如何使列表加權。
您可以在for
循環中繼續將輸入列表中的 dict 附加到 output 列表的最后一個子列表,但如果 output 列表為空,則創建一個新的子列表,最后一個子列表的權重總和加上當前項目超過 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}]]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.