能否按照插入顺序从Python字典中检索项目?
能否按照插入顺序从Python字典中检索项目?
如果你使用的是CPython 3.6+(或Python 3.7+的任何其他实现),标准Python dict
默认会执行此操作。
在旧版Python中,您可以使用collections.OrderedDict
来实现。
因此,您可以正常遍历字典或使用自版本 3.7 起改变:字典顺序保证为插入顺序,这个行为是 CPython 在 3.6 中的实现细节。
popitem()
方法。使用OrderedDict(),自版本2.7起可用
只是出于好奇:
from collections import OrderedDict
a = {}
b = OrderedDict()
c = OrderedDict()
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
其他答案是正确的;这不可能,但你可以自己编写。但是,如果你不确定如何实际实现此类功能,请参考我刚刚编写和测试的完整可工作的实现,它是通过字典子类化实现的。(请注意,传递给构造函数的值的顺序是未定义的,但将先于后面传递的值,并且您始终可以不允许使用有序字典初始化值。)
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')]
使用基本的字典类无法做到这一点——它是按哈希值排序的。你可以构建自己的字典,实际上是一个键值对列表或类似的东西,这样就可以排序了。
或者使用任何在PEP-372中描述的这里的实现,例如来自pythonutils的odict模块。
我成功地使用了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
中的项目。这是很大的区别。 - A.J. Uppal