如何从插入的字典中检索项目?
是否有可能按照插入的顺序从Python字典中检索项目?
标准的python dict
无法做到这一点。
有一个build议( PEP 372 )向标准库中的collections
模块添加一个“有序字典”(logging插入顺序)。 它包括链接到有序 词典的 各种 实现 (另请参阅Python 食谱中的这两个 食谱 )。
如果您希望代码与“官方”版本兼容(如果提案最终被接受),您可能希望坚持使用PEP中的参考实现。
编辑:PEP被接受,并添加在python2.7和3.1。 看文档 。
其他答案是正确的。 这是不可能的,但你可以自己写这个。 但是,如果你不确定如何实际实现这样的东西,这里是一个完整的工作实现,它的子类是我刚刚编写和testing的字典。 (请注意,传递给构造函数的值的顺序是未定义的,但会在稍后传递值之前出现,并且始终不允许使用值初始化有序的字典。)
class ordered_dict(dict): def __init__(self, *args, **kwargs): dict.__init__(self, *args, **kwargs) self._order = self.keys() def __setitem__(self, key, value): dict.__setitem__(self, key, value) if key in self._order: self._order.remove(key) self._order.append(key) def __delitem__(self, key): dict.__delitem__(self, key) self._order.remove(key) def order(self): return self._order[:] def ordered_items(self): return [(key,self[key]) for key in self._order] od = ordered_dict() od["hello"] = "world" od["goodbye"] = "cruel world" print od.order() # prints ['hello', 'goodbye'] del od["hello"] od["monty"] = "python" print od.order() # prints ['goodbye', 'monty'] od["hello"] = "kitty" print od.order() # prints ['goodbye', 'monty', 'hello'] print od.ordered_items() # prints [('goodbye','cruel world'), ('monty','python'), ('hello','kitty')]
你不能这样做基地字典类 – 它是由哈希sorting。 你可以build立你自己的字典,这个字典实际上是一个关键字,值对或者其他的列表,这些将被sorting。
或者,只要把key作为元组中的第一个字段time.now()就可以了。
然后你可以用dictname.keys()检索密钥,sorting和瞧!
格里
使用OrderedDict(),从2.7版开始可用
只是一个好奇的问题:
from collections import OrderedDict a = {} b = OrderedDict() c = OredredDict() a['key1'] = 'value1' a['key2'] = 'value2' b['key1'] = 'value1' b['key2'] = 'value2' c['key2'] = 'value2' c['key1'] = 'value1' print a == b #True print a == c #True print b == c #False
我以前使用StableDict取得了很好的成功。
或者使用这里描述的PEP-372的任何实现,比如pythonutils的odict模块 。
我成功地使用了pocoo.org实现,就像replace你的
my_dict={} my_dict["foo"]="bar"
同
my_dict=odict.odict() my_dict["foo"]="bar"
并只需要这个文件
除非将密钥存储在单独的列表中供以后参考,否则这是不可能的。
你可以做的是用代表input顺序的键插入值,然后调用sorted()
项。
>>> obj = {} >>> obj[1] = 'Bob' >>> obj[2] = 'Sally' >>> obj[3] = 'Joe' >>> for k, v in sorted(obj.items()): ... print v ... Bob Sally Joe >>>
如果你不需要字典function,只需要按照你插入的顺序返回元组,那么队列工作会不会更好?