根据字典中的键值对将字典列表分为列表长度的列表

时间:2019-10-29 17:42:33

标签: python python-2.7 dictionary list-comprehension

我有一个字典列表,按给定的键/值“ 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,但是我在弄清楚如何加权列表方面遇到困难。

1 个答案:

答案 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}]]

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