相关疑难解决方法(0)

是否在Python 3.6+中订购了字典?

字典在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保留插入顺序

python dictionary python-3.x python-internals python-3.6

386
推荐指数
5
解决办法
8万
查看次数

"setdefault"dict方法的用例

加入collections.defaultdict在Python 2.5大大降低用于需要dictsetdefault方法.这个问题适合我们的集体教育:

  1. setdefault今天在Python 2.6/2.7中还有什么用处?
  2. 哪些流行的用例setdefault被取代了collections.defaultdict

python dictionary setdefault

181
推荐指数
7
解决办法
9万
查看次数

如何重写此函数以实现OrderedDict?

我有以下函数,它将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)

python xml collections lxml

13
推荐指数
1
解决办法
7186
查看次数

使用相同的键合并元组

如何使用相同的键合并元组

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)

python tuples

12
推荐指数
3
解决办法
1421
查看次数

从OrderedDict和defaultdict继承子类

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中获得可能会使这更简单?

python collections multiple-inheritance python-3.x

11
推荐指数
1
解决办法
5383
查看次数

为什么我不能通过继承OrderedDict和defaultdict来创建默认的,有序的dict?

我首次尝试将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

11
推荐指数
1
解决办法
2174
查看次数

python list comprehension:收集重复的列

我有一个包含重复的第一个元素的列表的排序列表.目前我正在迭代它以获得解决方案.

[['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]]

谢谢

python

3
推荐指数
1
解决办法
206
查看次数

有效地分组元组列表

我有一个很大的元组列表,例如[ (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 …

python algorithm group-by list

2
推荐指数
2
解决办法
3655
查看次数

访问有序默认字典中的对象

我使用从订单的默认字典这里.问题是我不知道如何访问对象.

我期待这样的事情应该奏效

{% 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)

python dictionary jinja2 flask python-2.7

0
推荐指数
1
解决办法
124
查看次数

将项目放入字典而不更改顺序

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

0
推荐指数
1
解决办法
54
查看次数