是否可以按照插入的顺序从Python字典中检索项目?如何从字典中按照插入的顺序检索项目?
回答
标准python dict
无法做到这一点。
有一个建议(PEP 372)向标准库中的collections
模块添加一个“有序字典”(记录插入顺序)。它包括链接variousimplementationsofordereddictionaries(也可参见Python食谱中的这些tworecipes)。
如果您希望自己的代码与“官方”版本兼容(如果提案最终被接受),您可能希望坚持使用PEP中的参考实现。
编辑:PEP被接受并在python 2.7和3.1中添加。见the docs。
你不能使用基类字典类来做到这一点 - 它是由哈希排序。你可以建立你自己的字典,这个字典实际上是一个关键字,值对或者其他的列表,它们将被排序。
您的字典实现可以改为使用标准字典和列表 - 字典存储键 - >值关联,并且列表按照顺序存储密钥y被插入。 – 2008-09-13 21:56:24
其他答案是正确的;这是不可能的,但你可以自己写这个。但是,如果你不确定如何实际实现这样的东西,这里有一个完整的工作实现,它的子类是我刚刚编写和测试的字典。 (请注意,值传递给构造的顺序是不确定的,但会晚一点传递的值之前,你可以永远只是不允许有序类型的字典要与值初始化)。
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')]
order_dict(('key_a','value_a'),('key_b','value_b'))是否正确排序?看起来_order会被设置为__init__中的self.keys(),它是按散列顺序排序的,而不是它输入的顺序?只是好奇。 – 2008-12-09 20:57:55
你是对的,这就是为什么我说,“传递给构造函数的值的顺序是未定义的,但会在稍后传递值之前出现”。可以对这些对象进行适当排序,但我不确定这是否是一种理想的行为,因为可以说这些对象是同时插入的。 – 2008-12-10 22:13:49
如果你不需要字典功能,并且只需要按照插入它们的顺序返回元组,不会有更好的队列工作吗?
我以前用StableDict取得了很好的成功。
或者,只要有time.now()作为元组的第一场关键的元组。
然后你可以用dictname.keys(),sort和voila检索密钥!
格里
这使得无法准确了解何时插入字典中的条目是不可能的。它不比键值对更好。 – user2357112 2014-06-04 03:03:22
它,除非你存储在单独的列表中的键供以后参考是不可能的。
或使用任何用于PEP-372的实施方式的从pythonutils描述here,像odict module。
我成功地使用了pocoo。组织实施,这是因为你的
my_dict={}
my_dict["foo"]="bar"
与
my_dict=odict.odict()
my_dict["foo"]="bar"
更换一样方便,需要的只是this file
你可以做的是插入一个键代表顺序输入的值,并然后在物品上拨打sorted()
。
>>> obj = {}
>>> obj[1] = 'Bob'
>>> obj[2] = 'Sally'
>>> obj[3] = 'Joe'
>>> for k, v in sorted(obj.items()):
... print v
...
Bob
Sally
Joe
>>>
使用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
- 1. 如何按值项目的顺序处理python字典项目?
- 2. 按照字典顺序排列一个
- 3. 我们可以按照它们插入的顺序检索字典<A,B>元素吗?
- 4. 按照输入的顺序排列字典的值,如何输入
- 5. 如何按照字典顺序列举无序对整数
- 6. 在Python中,如何轻松地从字典中检索已排序的项目?
- 7. 按顺序更改字典中的项目范围O(n)
- 8. 如何按照字典顺序排列ArrayList?
- 9. 如何按照各自名称中的字母按字母顺序对列表中的项目进行排序。
- 10. Python:按添加的顺序检索字典键?
- 11. 如何按照插入顺序遍历Multimap?
- 12. 如何检索字典中的第N个项目?
- 13. 在java中按字典顺序排列(按字母顺序)
- 14. 如何根据DynamoDB中插入的顺序获取项目?
- 15. C++按字母顺序插入排序
- 16. 如何仅按照字母顺序打印嵌套在列表中,字典内的内部字典的键?
- 17. 按照mysql表中的顺序显示项目
- 18. Java集合是有序的按照插入顺序
- 19. Android - 如何从Firebase的插入顺序中检索对象列表?
- 20. 按照字典顺序的Aerospike限制记录
- 21. Backbone.js - 按顺序插入新的查看项目
- 22. Dojo拖放:如何检索项目的顺序?
- 23. 如何按关键字按字母顺序排列字典
- 24. 如何控制从plist项目创建的字典的迭代顺序?
- 25. LINQ to XML,按照正确的顺序检索rigt节点
- 26. 将按照写入的顺序对Python字典进行评估吗?
- 27. 如何强制字典元素按顺序写入?
- 28. vbscript按字母顺序插入一行
- 29. 如何按字母顺序检索列表的成员?
- 30. TinyMCE按钮插入顺序
可能重复[为什么字典中的值是不是在插入的订单?( http://stackoverflow.com/questions/6061380/why-dictionary-values-arent-in-the-inserted-order) – nbro 2015-01-10 01:52:42