字典在Python 3.6中排序(至少在CPython实现下),与之前的版本不同.这似乎是一个重大变化,但它只是文档中的一小段.它被描述为CPython实现细节而不是语言特性,但也暗示这可能成为未来的标准.
在保留元素顺序的同时,新字典实现如何比旧字典实现更好?
以下是文档中的文字:
dict()现在使用PyPy开创的"紧凑"表示.与Python 3.5相比,新dict()的内存使用量减少了20%到25%.PEP 468(在函数中保留**kwargs的顺序.)由此实现.这个新实现的顺序保留方面被认为是一个实现细节,不应该依赖(这可能会在未来发生变化,但是在更改语言规范之前,希望在几种版本的语言中使用这个新的dict实现为所有当前和未来的Python实现强制命令保留语义;这也有助于保持与随机迭代顺序仍然有效的语言的旧版本的向后兼容性,例如Python 3.5).(由INADA Naoki在issue 27350中提供.最初由Raymond Hettinger提出的想法.)
2017年12月更新:Python 3.7 保证了dict保留插入顺序
加入collections.defaultdict在Python 2.5大大降低用于需要dict的setdefault方法.这个问题适合我们的集体教育:
setdefault今天在Python 2.6/2.7中还有什么用处?setdefault被取代了collections.defaultdict?我有以下函数,它将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) 如何使用相同的键合并元组
list_1 = [("AAA", [123]), ("AAA", [456]), ("AAW", [147]), ("AAW", [124])]
Run Code Online (Sandbox Code Playgroud)
并将它们变成
list_2 = [("AAA", [123, 456]), ("AAW", [147, 124])]
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中获得可能会使这更简单?
我首次尝试将collections模块中两个字典的功能组合在一起,创建一个继承它们的类:
from collections import OrderedDict, defaultdict
class DefaultOrderedDict(defaultdict, OrderedDict):
def __init__(self, default_factory=None, *a, **kw):
super().__init__(default_factory, *a, **kw)
Run Code Online (Sandbox Code Playgroud)
但是,我无法为此词典分配项目:
d = DefaultOrderedDict(lambda: 0)
d['a'] = 1
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib64/python3.3/collections/__init__.py", line 64, in __setitem__
self.__map[key] = link = Link()
AttributeError: 'DefaultOrderedDict' object has no attribute '_OrderedDict__map'
Run Code Online (Sandbox Code Playgroud)
实际上,关于如何创建类似对象的这个问题有通过扩展OrderedDict类并手动重新实现所提供的其他方法来实现它的答案defaultdict.使用多重继承会更清晰.为什么不起作用?
python multiple-inheritance ordereddictionary python-3.x defaultdict
我有一个包含重复的第一个元素的列表的排序列表.目前我正在迭代它以获得解决方案.
[['5th ave', 111, -30.00, 38.00],
['5th ave', 222, -30.00, 33.00],
['6th ave', 2224, -32.00, 34.90]]
Run Code Online (Sandbox Code Playgroud)
我想要一个优雅的列表理解,将其转换为基于第一个元素的列表列表:
['5th ave', [[111, -30.00, 38.00] , [222, -30.00, 33.00]]
谢谢
我有一个很大的元组列表,例如[ (1,2), (1,3), (1,4), (2,1), (2,3) ]我想要有效地转换它[ (1, [1,2,3,4]), (2, [1,3] ) ].我正在通过每个元组的第一个元素对元组进行分组即(1,2), (1,3), (1,4)成为(1, [2,3,4])(也参见下面的Haskell版本).我怀疑这可以一次完成吗?输入列表始终是有序的.
在python尝试使用defaultdict我认为是没有重新发明轮子的自然解决方案.它运行良好,但它不保留键的顺序.一种解决方案是defaultdict按照此处的说明使用有序.
无论如何,我想知道这个问题的语言独立和有效的解决方案.我目前的解决方案需要两次通过,一次呼叫set( )列表.
更新
我正在考虑实现以下Haskell版本:
a = [ (1,2), (1,3), (1,4), (2,1), (2,3) ]
b = groupBy (\ x y -> fst x == fst y )
b
[[(1,2),(1,3),(1,4)],[(2,1),(2,3)]]
map (\x -> (fst .head $ x, map snd x ) ) b
[(1,[2,3,4]),(2,[1,3])]
Run Code Online (Sandbox Code Playgroud)
我实施了两个答案(coldspeed和pm2ring).在中等大小的列表(最多10 …
我使用从订单的默认字典这里.问题是我不知道如何访问对象.
我期待这样的事情应该奏效
{% for zone in data %}
{% for reservation in zone %}
{{reservation}} # 1 | 2| 3
{% endfor %}
{% endfor %}
Run Code Online (Sandbox Code Playgroud)
数据有助于调试
{{data}}
OrderedDefaultDict(<type 'list'>, DefaultOrderedDict([('1', [<app.backoffice.models.Reservation object at 0x7f91c2c5ee10>, <app.backoffice.models.Reservation object at 0x7f91c2c732d0>, <app.backoffice.models.Reservation object at 0x7f91c2c73510>]), ('2', [<app.backoffice.models.Reservation object at 0x7f91c2c73790>, <app.backoffice.models.Reservation object at 0x7f91c32f9c50>]), ('3', [<app.backoffice.models.Reservation object at 0x7f91c2c733d0>, <app.backoffice.models.Reservation object at 0x7f91c2c73490>])]))
Run Code Online (Sandbox Code Playgroud)
{% for zone in data %}
{{zone}} # 1 | 2 | 3
{{zone[0]}} # 1 | …Run Code Online (Sandbox Code Playgroud) from collections import OrderedDict
l = [('Monkey', 71), ('Monkey', 78), ('Ostrich', 80), ('Ostrich', 96), ('Ant', 98)]
d = OrderedDict()
for i, j in l:
d[i] = j
print d
OrderedDict([('Monkey', 78), ('Ostrich', 96), ('Ant', 98)])
Run Code Online (Sandbox Code Playgroud)
预期的'd'应该是:
OrderedDict([('Monkey', (71,78)), ('Ostrich', (80,96)), ('Ant', 98)])
Run Code Online (Sandbox Code Playgroud)
如果所有值都被组合或列出,则没有问题.
python ×10
dictionary ×3
python-3.x ×3
collections ×2
algorithm ×1
defaultdict ×1
flask ×1
group-by ×1
jinja2 ×1
list ×1
lxml ×1
python-2.7 ×1
python-3.6 ×1
setdefault ×1
tuples ×1
xml ×1