字典在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保留插入顺序
有没有办法重命名字典键,而无需将其值重新分配给新名称并删除旧名称键; 并且没有迭代通过dict键/值?
在OrderedDict的情况下,执行相同的操作,同时保持该键的位置.
我指的是模块中的OrderedDictcollections,它是一个有序字典.
如果它具有可订购的附加功能,我意识到这可能通常不是必要的,但即便如此,是否有任何缺点?它慢了吗?它缺少任何功能吗?我没有看到任何遗漏的方法.
简而言之,为什么我不应该总是使用它而不是普通的字典呢?
我有一个类似的列表
allsites = [
{
'A5': 'G',
'A10': 'G',
'site': 'example1.com',
'A1': 'G'
},
{
'A5': 'R',
'A10': 'Y',
'site': 'example2.com',
'A1': 'G'
}
]
Run Code Online (Sandbox Code Playgroud)
我用的是json.dumps:
data = { 'Author':"joe", 'data':allsites }
print json.dumps(data,sort_keys=True,indent=4, separators=(',', ': '))
Run Code Online (Sandbox Code Playgroud)
这会输出以下JSON:
{
"Author": "joe",
"data": [
{
"A1": "G",
"A10": "G",
"A5": "G",
"site": "example1.com"
},
{
"A1": "G",
(...)
Run Code Online (Sandbox Code Playgroud)
我希望通过自定义键("alphabet")对此JSON字符串的"data"部分进行排序,在上面的情况下,这将是site, A1, A5, A10实际上看起来像:
{
"Author": "joe",
"data": [
{
"site": "example1.com",
"A1": "G",
"A5": "G",
"A10": "G"
}, …Run Code Online (Sandbox Code Playgroud) 鉴于字典看起来像这样:
{
'Color': ['Red', 'Yellow'],
'Size': ['Small', 'Medium', 'Large']
}
Run Code Online (Sandbox Code Playgroud)
如何创建一个结合了第一个字典键的各种值的字典列表?我想要的是:
[
{'Color': 'Red', 'Size': 'Small'},
{'Color': 'Red', 'Size': 'Medium'},
{'Color': 'Red', 'Size': 'Large'},
{'Color': 'Yellow', 'Size': 'Small'},
{'Color': 'Yellow', 'Size': 'Medium'},
{'Color': 'Yellow', 'Size': 'Large'}
]
Run Code Online (Sandbox Code Playgroud) 根据PEP 468:
从版本3.6开始,Python将保留传递给函数的关键字参数的顺序.为了实现这一点,收集的kwargs现在将是有序映射.请注意,这并不一定意味着
OrderedDict.
在这种情况下,为什么这个有序映射无法与Python的规范有序映射类型进行相等比较,collections.OrderedDict:
>>> from collections import OrderedDict
>>> data = OrderedDict(zip('xy', 'xy'))
>>> def foo(**kwargs):
... return kwargs == data
...
>>> foo(x='x', y='y') # expected result: True
True
>>> foo(y='y', x='x') # expected result: False
True
Run Code Online (Sandbox Code Playgroud)
虽然现在保留了迭代顺序,但kwargs似乎表现得像比较的普通字典.从3.5开始,Python有一个C实现的有序字典,因此它可以直接使用(或者,如果性能仍然是一个问题,使用3.6紧凑字典的瘦子类更快的实现).
为什么函数接收的有序映射不会在相等比较中遵循排序?
我想要一个排序的字典.但之间的项目的顺序mydict和orddict似乎并没有改变.
from collections import OrderedDict
mydict = {'a':1,'b':2,'c':3,'d':4}
orddict = OrderedDict(mydict)
print(mydict,orddict)
# print items in mydict:
print('mydict')
for k,v in mydict.items():
print(k,v)
print('ordereddict')
# print items in ordered dictionary
for k,v in orddict.items():
print(k,v)
# print the dictionary keys
# for key in mydict.keys():
# print(key)
# print the dictionary values
# for value in mydict.values():
# print(value)
Run Code Online (Sandbox Code Playgroud) 我正在尝试实现一个返回图形边缘的方法,由邻接列表/字典表示.
因此,为了遍历字典,首先我遍历键,然后遍历存储在相应键中的每个值.在嵌套的for循环中,我有一个条件,如果一个特定的边,说(a,b)不在边集中,那么将它添加到set - 否则.在我第一次运行时,该方法采用了相同的边 - 也就是说,在边集中,有(a,b)和(b,a).
class Graph():
def __init__(self, grph={}):
self.graph = grph
def get_vertices(self):
for keys in self.graph:
yield keys
def get_edges(self):
edges = set()
for key in self.graph:
for adj_node in self.graph[key]:
if (key, adj_node) not in edges:
edge = (key, adj_node)
edges.add(edge)
else:
pass
return edges
def main():
graph1 = {
'A': ['B','C','D'],
'B': ['A','E'],
'C': ['A', 'D'],
'D': ['A', 'C'],
'E': ['B'],
}
graph_one = Graph(graph1)
print(list(graph_one.get_vertices()))
print(graph_one.get_edges())
if __name__ =='__main__':
main()
Run Code Online (Sandbox Code Playgroud)
输出是:
{( 'A', …
python ×8
dictionary ×6
python-3.x ×4
python-2.7 ×2
python-3.6 ×2
function ×1
json ×1
kwargs ×1
list ×1
sorting ×1