LinkedHashMap是具有可预测迭代顺序的类似Hashtable的数据结构(Python中的dict)的Java实现.这意味着在遍历所有键的过程中,它们是通过插入来排序的.这是通过维护插入顺序的附加链表来完成的.
是否有与Python相同的东西?
Python中是否存在类似于容器的东西,就像向量和列表一样?
任何链接也会有所帮助.
我有以下函数,它将XML文件解析为字典.
不幸的是,由于Python字典没有排序,我无法按照我的意愿循环遍历节点.
如何更改此值以便输出一个有序字典,该字典反映了使用'for'循环时节点的原始顺序.
def simplexml_load_file(file):
import collections
from lxml import etree
tree = etree.parse(file)
root = tree.getroot()
def xml_to_item(el):
item = None
if el.text:
item = el.text
child_dicts = collections.defaultdict(list)
for child in el.getchildren():
child_dicts[child.tag].append(xml_to_item(child))
return dict(child_dicts) or item
def xml_to_dict(el):
return {el.tag: xml_to_item(el)}
return xml_to_dict(root)
x = simplexml_load_file('routines/test.xml')
print x
for y in x['root']:
print y
Run Code Online (Sandbox Code Playgroud)
输出:
{'root': {
'a': ['1'],
'aa': [{'b': [{'c': ['2']}, '2']}],
'aaaa': [{'bb': ['4']}],
'aaa': ['3'],
'aaaaa': ['5']
}}
a
aa
aaaa
aaa
aaaaa …Run Code Online (Sandbox Code Playgroud) Raymond Hettinger 展示了一种非常酷的方式来组合集合类:
from collections import Counter, OrderedDict
class OrderedCounter(Counter, OrderedDict):
pass
# if pickle support is desired, see original post
Run Code Online (Sandbox Code Playgroud)
我想为OrderedDict和defaultdict做类似的事情.但是,当然,defaultdict有不同的__init__签名,因此需要额外的工作.解决这个问题最简洁的方法是什么?我使用Python 3.3.
我在这里找到了一个很好的解决方案:https://stackoverflow.com/a/4127426/336527,但我想可能从defaultdict中获得可能会使这更简单?
当我声明一个列表1,2,3,4并且我对它做了一些事情,即使只是打印我也会得到相同的序列1,2,3,4.
但是当我对字典做任何事情的时候,它们总是会改变数字序列,就好像它是以一种我无法理解的扭曲方式排序.
test1 = [4,1,2,3,6,5]
print test1
test2 = {"c":3,"a":1,"b":2,"d":4}
print test2
[4, 1, 2, 3, 6, 5]
{'a': 1, 'c': 3, 'b': 2, 'd': 4}
Run Code Online (Sandbox Code Playgroud)
世界上的'a'如何成为第一个元素和'c',即使按字母顺序对字典进行排序,它应该是1,2,3,4或a,b,c,d不是1,3,2, 4.wT?F @!$!@ $#@!
那么我如何打印,从字典中获取值而不改变元素的位置.
我已经看过(并写过)了很多这方面的实现.有没有被认为是最好的或正在成为标准?
我所说的有序dict是指对象有一些键的顺序概念,类似于PHP中的数组.
来自PEP 372的冒险似乎是一个强有力的候选人,但它并不完全清楚它是胜利者.
可能重复:
如何从字典中按照插入的顺序检索项目?
我有django视图和模板的问题
在获得与会议相关的详细信息之后
for meeting in get_meetings:
if meeting.venue_id ==None:
mee_data = {}
mee_data['id'] = meeting.id
getdate = meeting.meeting_datetime
mee_data['date'] = getdate.strftime("%Y-%m-%d")
mee_data['end_time'] = meeting.end_time
mee_data['meeting_duration'] = meeting.meeting_duration
mee_data['start_time'] = meeting.start_time
mee_data['meetingID'] = meeting.meetingID
mee_data['id'] = meeting.id
mee_data['start_time'] = meeting.start_time
mee_data['name'] = meeting.name
getall.append(mee_data)
Run Code Online (Sandbox Code Playgroud)
getall是我在上面声明的列表
现在添加字典数据后.
我期待我的模板中的结果就像
[{"id": "REG_431103567", "date": "", "end_time": "", "meeting_duration": "", "start_time": "2012-10-29", "meetingID": 192dnjd, "name": "TEsts"},...]
Run Code Online (Sandbox Code Playgroud)
基本上是键的顺序但不幸的是结果就像.
[{"meetingID": "REG_431103567", "start_time": "", "meeting_duration": "", "end_time": "", "date": "2012-10-29", "id": 192, "name": "TEsts"},...]
Run Code Online (Sandbox Code Playgroud)
请建议我应该在这里做什么,这样我才能以正确的方式获得密钥及其相应的值.
谢谢
我知道通常字典中键/值的顺序是任意的.但是,如果您声明字典"longhand"(见下文)然后从不添加或删除任何键,这是否意味着密钥顺序将在您声明时保留?
我做了几个简短的实验,答案似乎是肯定的,但在我依靠这个之前,我想确定一下.
当我说"手写"时,我只是指一个明确的每个键和值的声明:
myDict = {key1: val1, key2: val2, key3: val3, .... }
Run Code Online (Sandbox Code Playgroud) python ×8
dictionary ×4
collections ×2
list ×2
c++ ×1
containers ×1
django ×1
lxml ×1
python-2.7 ×1
python-3.x ×1
sequence ×1
vector ×1
xml ×1