我有一个python列表,其中包含个人信息的词条,如下所示:
entries = [
{
"first_name": "philip",
"last_name": "fry"
},
{
"first_name": "john",
"last_name": "zoidberg"
}
]
我想在此列表中添加条目,例如维持升序(姓氏,名字)顺序的方式。 bisect模块看起来很有希望,但它似乎不支持这一点。
感谢任何帮助!
答案 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)