字典在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中打印深度为~4的字典呢?我尝试使用漂亮的打印pprint()
,但它不起作用:
import pprint
pp = pprint.PrettyPrinter(indent=4)
pp.pprint(mydict)
Run Code Online (Sandbox Code Playgroud)
我只想"\t"
为每个嵌套设置一个缩进(),这样我得到这样的东西:
key1
value1
value2
key2
value1
value2
Run Code Online (Sandbox Code Playgroud)
等等
我怎样才能做到这一点?
加入collections.defaultdict
在Python 2.5大大降低用于需要dict
的setdefault
方法.这个问题适合我们的集体教育:
setdefault
今天在Python 2.6/2.7中还有什么用处?setdefault
被取代了collections.defaultdict
?我想结合OrderedDict()
,并defaultdict()
从collections
一个对象,这应是一个有序的,默认的字典.这可能吗?
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中获得可能会使这更简单?
我需要一个存储字典的字典数据结构,如下所示:
custom = {1: {'a': np.zeros(10), 'b': np.zeros(100)},
2: {'c': np.zeros(20), 'd': np.zeros(200)}}
Run Code Online (Sandbox Code Playgroud)
但问题是我在代码中多次迭代这个数据结构.每次迭代它时,我都需要遵守迭代的顺序,因为这个复杂数据结构中的所有元素都映射到一维数组(如果你愿意,可以序列化),因此顺序很重要.我考虑过编写一个有序dict
的订单dict
,但我不确定这是正确的解决方案,因为我似乎可能选择了错误的数据结构.对我的案子来说,最合适的解决办法是什么?
UPDATE
所以这就是我到目前为止所提出的:
class Test(list):
def __init__(self, *args, **kwargs):
super(Test, self).__init__(*args, **kwargs)
for k,v in args[0].items():
self[k] = OrderedDict(v)
self.d = -1
self.iterator = iter(self[-1].keys())
self.etype = next(self.iterator)
self.idx = 0
def __iter__(self):
return self
def __next__(self):
try:
self.idx += 1
return self[self.d][self.etype][self.idx-1]
except IndexError:
self.etype = next(self.iterator)
self.idx = 0
return self[self.d][self.etype][self.idx-1]
def __call__(self, d):
self.d = -1 - d
self.iterator = …
Run Code Online (Sandbox Code Playgroud) 我觉得我在这里错过了一些明显的东西!
seq = {'a': ['1'], 'aa': ['2'], 'aaa': ['3'], 'aaaa': ['4'], 'aaaaa': ['5']}
for s in seq:
print s
Run Code Online (Sandbox Code Playgroud)
输出:
a
aa
aaaa
aaaaa
aaa
Run Code Online (Sandbox Code Playgroud)
当然它应该输出:
a
aa
aaa
aaaa
aaaaa
Run Code Online (Sandbox Code Playgroud)
这里出了什么问题?
谢谢 :)
我不想使用numpy来处理2D矩阵
我想出了如何创建看起来像行和列字典的东西.如果我想查找单个值,它可以正常工作.
但我无法弄清楚如何以与使用我的列相同的顺序从一行获取值
from collections import defaultdict
dic = defaultdict(dict)
rowKeys = ['1','2','3']
columnKeys = ['alfa', 'omega', 'bravo', 'charlie']
# Filling up the dictionary with values
from random import randrange
for rKey in rowKeys:
for cKey in columnKeys:
dic[rKey][cKey] = randrange(50)
"""
print dic
defaultdict(<type 'dict'>, {
'1': {'omega': 28, 'charlie': 42, 'alfa': 13, 'bravo': 45},
'3': {'omega': 8, 'charlie': 5, 'alfa': 13, 'bravo': 4},
'2': {'omega': 19, 'charlie': 42, 'alfa': 29, 'bravo': 26}})
"""
# print dic[rowKeys[0]].keys()
# ['omega', …
Run Code Online (Sandbox Code Playgroud) 我按时间戳将对象列表分组在一起:
object_list = [
{
timestamp: datetime.strptime("01/01/2014", "%d/%m/%y"),
},
{
timestamp: datetime.strptime("12/05/2014", "%d/%m/%y"),
},
{
timestamp: datetime.strptime("03/01/2014", "%d/%m/%y"),
},
{
timestamp: datetime.strptime("01/01/2014", "%d/%m/%y"),
}]
date_grouped_objects = defaultdict(list)
for obj in object_list:
date_grouped_objects[obj.timestamp].append(obj)
Run Code Online (Sandbox Code Playgroud)
这给了我我想要的东西,一个按时间戳属性组合在一起的对象列表.
问题:我现在想要通过键(时间戳)对date_grouped_objects进行排序,但是不清楚如何使用sorted来实现这一点?因此,最近日期的最多组将是最后一个
所以我要追求的是:
[
["01/01/2014"] = [...],
["03/01/2014"] = [...],
["12/05/2014"] = [...],
]
Run Code Online (Sandbox Code Playgroud)
键实际上是日期对象,而不是字符串.
python ×10
dictionary ×8
python-3.x ×2
collections ×1
for-loop ×1
list ×1
python-3.6 ×1
setdefault ×1