Python - 在保持顺序的同时附加到dicts列表

时间:2015-08-23 18:42:32

标签: python

我有一个python列表,其中包含个人信息的词条,如下所示:

entries = [
    {
        "first_name": "philip",
        "last_name": "fry"
    },
    {
        "first_name": "john",
        "last_name": "zoidberg"
    }
]

我想在此列表中添加条目,例如维持升序(姓氏,名字)顺序的方式。 bisect模块看起来很有希望,但它似乎不支持这一点。

感谢任何帮助!

4 个答案:

答案 0 :(得分:2)

根据您需要的效率,您可以在每次添加后求助。像(未经测试的代码):

def add(item, aList):
    aList.append(item)
    return sorted(aList, key=lambda entry:"{}{}".format(entry['last_name'], entry['first_name'])

效率不高,但如果你有灵活性,那就很简单。

答案 1 :(得分:2)

如果列表是同类的,即所有条目都是一对名称,则可以使用元组而不是dicts,因为在这种情况下密钥不会增加很多值。

如果您将元组保留为姓氏,则可以使用bisect:

来命名
In [1]: entries = [("fry", "philip"), ("zoidberg", "john")]

In [2]: entries.sort()

In [3]: entries
Out[3]: [('fry', 'philip'), ('zoidberg', 'john')]

In [4]: import bisect

In [5]: bisect.insort(entries, ("turanga", "leela"))

In [6]: entries
Out[6]: [('fry', 'philip'), ('turanga', 'leela'), ('zoidberg', 'john')]

答案 2 :(得分:1)

您认为bisect模块可以满足您的需求,这是非常有效的。由于它没有key函数,您只需在调用之前构建自己的密钥列表。然后它将返回正确的插入点,供您在列表中使用:

import bisect

entries = [
    {"first_name": "philip", "last_name": "fry"},
    {"first_name": "john", "last_name": "zoidberg"}]

new_entry = {'first_name': 'anne', 'last_name': 'bedford'}

keys = [(d['last_name'], d['first_name']) for d in entries]
entries.insert(bisect.bisect_left(keys, (new_entry['last_name'], new_entry['first_name'])), new_entry)
print entries

这会给你以下输出:

[{'first_name': 'anne', 'last_name': 'bedford'}, {'first_name': 'philip', 'last_name': 'fry'}, {'first_name': 'john', 'last_name': 'zoidberg'}]

答案 3 :(得分:1)

一种不太简单但效率更高的方法是使用sortedcontainers模块(如您所怀疑使用bisect)。

您必须扩展dict以使其可排序。

class Person(dict):
    def __lt__(self, other):
        return '{}{}'.format(self['last_name'], self['first_name']) <
               '{}{}'.format(other['last_name'], other['first_name'])

然后将Person个对象添加到排序列表中:

from sortedcontainers import SortedList
sorted_list = SortedList()
p = Person()
p['first_name'] = 'philip'
p['last_name']  = 'fry'
sorted_list.append(p)