题
是否有可能检索项目从Python字典中的顺序插入?
解决方案
标准的蟒蛇 dict
这不会默认情况下如果您使用的CPython3.6+(或Python3.7对于任何其他执行Python).
在旧版本的蟒蛇可以使用 collections.OrderedDict
.
其他提示
其他的答案是正确的;这是不可能的,但你可以写你自己。但是,如果你不确定实际上如何实现这样的事情,这里是一个完整的工作和执行这类dict我刚刚写和测试。(注意,值的顺序通过的构造不确定但会之前的价值观传给后,你总是可以只是不允许下令字典进行初始化与价值观。)
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')]
使用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
或者,只是使关键元组的时间。now()作为第一个领域中的元组。
然后你可以检索的钥匙dictname.钥匙()、排序,瞧!
格里
作为Python3.7,标准字典中保留插入序。从 文档:
改变在3.7版:词典以保证是插入序。这种行为是执行详细的CPython从3.6.
所以,你应该可以迭代过字典中的通常或使用 popitem()
.
你不能这样做的基dict类-这是命令通过散列。你可以建立自己的字典,真的是一个列表中的关键,值对或somesuch,这将是有序的。
我用StableDict之前有很好的成功。
或者使用任何实现的 PEP-372 描述 在这里,, 像的 odict模块 从 pythonutils.
我成功地使用的pocoo.org 执行,它是作为容易,因为替换你
my_dict={}
my_dict["foo"]="bar"
与
my_dict=odict.odict()
my_dict["foo"]="bar"
和需要的只是 这个文件
这是不可能的,除非你在商店的钥匙在一个单独的名单中引用之后。
什么你能做的就是插入的价值的一个关键代表以输入,然后调 sorted()
在该项目。
>>> obj = {}
>>> obj[1] = 'Bob'
>>> obj[2] = 'Sally'
>>> obj[3] = 'Joe'
>>> for k, v in sorted(obj.items()):
... print v
...
Bob
Sally
Joe
>>>
如果你不需要dict功能,只需要回元组在为你已经插入他们,不是一个队的工作更好吗?