我正在为网站写信使。 所以,我有一些功能序列 首先是
def get_messages(self):
"""select query"""
messages = self.model.load(['or', ('sender', self.my_id), ('receiver', self.my_id)])
return messages
返回数据库表中包含消息的所有记录,其中我是消息的发送者或接收者 下一个功能是
def get_dialogs(self):
"""returns dialogs of curr user"""
dialogs = {}
for msg in self.messages:
if msg['receiver'] != self.my_id:
tmp_d = msg['receiver']
else:
tmp_d = msg['sender']
if tmp_d not in dialogs.keys():
dialogs[tmp_d] = [msg]
else:
dialogs[tmp_d].append(msg)
return dialogs
这里我正在准备dict,其中key是与我交谈的用户。
问题出现了。
这是消息序列的屏幕截图。
我希望dict键序列按照添加到值列表的最后一条消息进行排序
在这里,我没有对其进行排序,实际上存在一个问题(我无法理解的问题) - 默认情况下,键序列应为1, 4, 222595, 99
,但程序认为是99, 1, 222595, 4
(我检查了get_messages
func以正确的顺序返回消息。
主要问题
如何对dict键进行排序(或者排序后才知道dict无法排序)按上次更改值?
答案 0 :(得分:4)
dict
未排序 - 键不会以任何特定顺序出现。
请考虑使用标准库中的collections.OrderedDict
。 OrderedDict
会根据插入时间(即根据项目添加到词典的顺序)对项目进行排序。
答案 1 :(得分:0)
您可以结帐RevisionDict
。它会记住按键更新时的顺序(与OrderedDict相反,OrderedDict记住按键插入时的顺序)。 RevisionDict
的界面与dict
100%兼容。
>>> d['a']=0; d['b']=1; d['c']=2 # make three updates
>>> d
RevisionDict([_Item(key='a', value=0, revision=1),
_Item(key='b', value=1, revision=2),
_Item(key='c', value=2, revision=3)])
>>> d['a']=3 # update value of 'b' (was 2 before)
>>> d
RevisionDict([_Item(key='b', value=1, revision=2),
_Item(key='c', value=2, revision=3),
_Item(key='a', value=3, revision=4)])
披露:我是该图书馆的作者。