Python:将新元素插入到排序的字典列表中

时间:2016-06-28 14:36:11

标签: python-2.7 sorting dictionary python-2.6

我已经有一个已经按键id排序的词典列表。

y = [{'id': 0, 'name': 'Frank'},
     {'id': 5, 'name': 'Hank'},
     {'id': 8, 'name': 'Fred'},
     {'id': 30, 'name': 'Jill'}]

我想在列表中插入一个新元素。

y.append({'id': 6, 'name': 'Jenkins'})

添加新元素后,如何避免再次按如下方式对列表进行排序?

y = sorted(y, key=lambda x: x['id'])

理想的结果是:

y = [{'id': 0, 'name': 'Frank'},
     {'id': 5, 'name': 'Hank'},
     {'id': 6, 'name': 'Jenkins'},
     {'id': 8, 'name': 'Fred'},
     {'id': 30, 'name': 'Jill'}]

编辑:

使用bisect.insort(y, {'id': 6, 'name': 'Jenkins'})仅适用于第一个密钥,如果dict按名称排序,则会失败。

2 个答案:

答案 0 :(得分:3)

a insertion in a list is in O(n)以来,任何聪明的bisect算法都没用,所以你可以简单地循环列表来找到它应该插入的位置,然后插入它。类似的东西:

new_value = {'id': 6, 'name': 'Jenkins'}

for index, value in enumerate(y):
    # Assuming y is in increasing order.
    if value['id'] > new_value['id']:
        y.insert(index, new_value)
        break

答案 1 :(得分:1)

我建议将您的字典更改为一个类,重载比较运算符,然后使用bisect.insort()。我不建议遍历所有项目以找到其他答复中建议的插入位置。从理论上讲,复杂度仍然是O(n),但是,搜索项目要比插入新元素花费更长的时间。我想插入只会做一些内存复制,而对于搜索,您必须比较每个元素。

在我的示例中,反复查找位置,然后插入大约需要2分钟才能完成。使用bisect.insert()进行相同的数据大约需要10秒钟。