簡體   English   中英

根據字典內的鍵值對將字典列表拆分為具有列表長度的列表列表

[英]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}]]

演示: https://repl.it/@blhsing/ForcefulIroncladEmulation

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM