字典在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.OrderedDict上课时遇到了一些麻烦.我在Raspberry上使用Python 2.7,这是Raspberry Pi的Debian发行版.我正在尝试打印两个词典,以便进行文本冒险的比较(并排).订单对于准确比较至关重要.无论我尝试用他们通常无序的方式打印字典.
这是我在RPi上执行的操作:
import collections
ship = {"NAME": "Albatross",
"HP":50,
"BLASTERS":13,
"THRUSTERS":18,
"PRICE":250}
ship = collections.OrderedDict(ship)
print ship
# OrderedDict([('PRICE', 250), ('HP', 50), ('NAME', 'Albatross'), ('BLASTERS', 13), ('THRUSTERS', 18)])
Run Code Online (Sandbox Code Playgroud)
显然有些东西不对,因为它正在打印函数调用并将键和值组放入嵌套列表中......
这是我通过在PC上运行类似的东西得到的:
import collections
Joe = {"Age": 28, "Race": "Latino", "Job": "Nurse"}
Bob = {"Age": 25, "Race": "White", "Job": "Mechanic", "Random": "stuff"}
#Just for clarity:
Joe = collections.OrderedDict(Joe)
Bob = collections.OrderedDict(Bob)
print Joe
# OrderedDict([('Age', 28), ('Race', 'Latino'), ('Job', 'Nurse')])
print Bob
# OrderedDict([('Age', 25), ('Race', 'White'), ('Job', …Run Code Online (Sandbox Code Playgroud) 我正在尝试将排序的字典传递给 jsonify() 函数,然后在 JS 代码中使用它来取出值。我看到的是,即使我传递了正确的值,它们也会由于某种原因被 jsonify 重新排序。
json_data = {
"11": {
"j_id": "out",
},
"aa": {
"j_id": "in",
},
"bb": {
"j_id": "out",
},
}
jkeys=json_data.keys()
sorted_json = sorted(jkeys, key=lambda x: json_data[x]['j_id'], reverse=False)
new_sorted=OrderedDict()
for rec in sorted_json:
new_sorted[rec]=json_data[rec]
print('sort dict: {}'.format(new_sorted))
Run Code Online (Sandbox Code Playgroud)
输出是正确的,我可以看到正确的值,在我的情况下应该是:aa, 11, bb
>>> from collections import OrderedDict
>>>
>>> json_data = {
... "11": {
... "j_id": "out",
... },
... "aa": {
... "j_id": "in",
... },
... "bb": {
... "j_id": "out",
... }, …Run Code Online (Sandbox Code Playgroud) 给定一个Python列表,我想删除连续的“重复项”。但是,重复值是列表项的属性(在此示例中,是tuple第一个元素)。
输入:
[(1, 'a'), (2, 'b'), (2, 'b'), (2, 'c'), (3, 'd'), (2, 'e')]
Run Code Online (Sandbox Code Playgroud)
所需输出:
[(1, 'a'), (2, 'b'), (3, 'd'), (2, 'e')]
Run Code Online (Sandbox Code Playgroud)
不能使用set或dict,因为顺序很重要。
无法使用列表推导功能[x for x in somelist if not determine(x)],因为检查取决于前任。
我想要的是这样的:
[(1, 'a'), (2, 'b'), (2, 'b'), (2, 'c'), (3, 'd'), (2, 'e')]
Run Code Online (Sandbox Code Playgroud)
用Python解决此问题的首选方法是什么?
Python字典没有特定的顺序存储(映射没有顺序),例如
>>> myDict = {'first':'uno','second':'dos','third':'tres'}
myDict = {'first':'uno','second':'dos','third':'tres'}
>>> myDict
myDict
{'second': 'dos', 'third': 'tres', 'first': 'uno'}
Run Code Online (Sandbox Code Playgroud)
虽然可以从字典中检索已排序的列表或元组,但我想知道是否可以使字典按照它们传递给它的顺序存储项目,在前面的示例中,这将意味着将内部排序作为{'first':'uno','second':'dos','third':'tres'}和没有区别.
我需要这个,因为我正在使用字典存储值,因为我从配置文件中读取它们; 一旦读取和处理(值被更改),它们必须以与读取时相同的顺序写入新配置文件(此顺序不是字母顺序也不是数字顺序).
有什么想法吗?
请注意,我不是在寻找检索订单的次要方法(如列表),而是寻找使字典本身有序的方法(因为它将在即将推出的Python版本中).
我在做字典:
d = {"server":"mpilgrim", "database":"master"}
d['mynewkey'] = 'mynewvalue'
Run Code Online (Sandbox Code Playgroud)
但当我显示它时,我看到这个字典是颠倒的.
print(d)
{'mynewkey': 'mynewvalue', 'database': 'master', 'server': 'mpilgrim'}
Run Code Online (Sandbox Code Playgroud)
如何扭转它?
或者,如果字典不是可排序的,那么我必须使用哪个字符集来处理该信息的顺序很重要?
从3.7开始,保证标准的python词典保持插入顺序。(*)
d = {'b': 1, 'a': 2}
for k in d:
print(k)
# Prints always 'b' before 'a'.
Run Code Online (Sandbox Code Playgroud)
换句话说,字典键会严格保持顺序。原则上,这将允许密钥是可逆的。但是,以下任何一项均无效:
# TypeError: 'dict' object is not reversible
for k in reversed(d):
print(k)
# TypeError: 'dict_keys' object is not reversible
for k in reversed(d.keys()):
print(k)
Run Code Online (Sandbox Code Playgroud)
问题:此行为背后的原因是什么?为什么没有使命令具有可逆性?将来有什么计划改变这种行为?
解决方法当然可以:
for k in reversed(list(d.keys())):
print(k)
Run Code Online (Sandbox Code Playgroud)
(*)作为事实上,这种情况已经为Python 3.6的典型安装,如在讨论这个职位。
更新:从python 3.8字典开始实际上是可逆的。可接受的答案是指Guido与其他导致该决定的核心开发人员之间的讨论。简而言之,他们权衡了语言一致性,实现工作和用户的实际利益。
我刚开始玩Python(VBA背景).为什么这本字典无序创建?不应该是:1,b:2 ......等等?
class Card:
def county(self):
c = 0
l = 0
groupL = {} # groupL for Loop
for n in range(0,13):
c += 1
l = chr(n+97)
groupL.setdefault(l,c)
return groupL
pick_card = Card()
group = pick_card.county()
print group
Run Code Online (Sandbox Code Playgroud)
这是输出:
{'a': 1, 'c': 3, 'b': 2, 'e': 5, 'd': 4, 'g': 7, 'f': 6, 'i': 9, 'h': 8, 'k': 11, 'j': 10, 'm': 13, 'l': 12}
Run Code Online (Sandbox Code Playgroud)
或者,它是否只是打印失序?
我正在尝试从一些教程中学习Python.这是我遇到的一个简单的例子,让我感到困惑.
>>> d={"server":"mpilgrim", "database":"master", "uid":"sa", "pwd":"secret"}
>>> d
{'pwd': 'secret', 'database': 'master', 'uid': 'sa', 'server': 'mpilgrim'}
>>> d.keys()
['pwd', 'database', 'uid', 'server']
>>> d.values()
['secret', 'master', 'sa', 'mpilgrim']
Run Code Online (Sandbox Code Playgroud)
正如您在我定义字典的第一行中所看到的,该项是字典"pwd":"secret"中的最后一个元素.但是,当我输出字典时,它成为第一个元素.字典的其余部分已经重新排序.
我可以知道为什么会这样吗?
如果我使用dict.keys()从字典中提取密钥并按照我认为的顺序迭代它,那会导致不匹配问题吗?
无论我在哪里搜索,他们都说python词典没有任何顺序.当我运行代码1时,每次显示不同的输出(随机顺序).但是当我运行代码2时,它总是显示相同的排序输出.为什么字典在第二个片段中排序?
#code 1
d = {'one': 1, 'two': 2, 'three': 3, 'four': 4}
for a, b in d.items():
print(a, b)
#code 2
d = {1: 10, 2: 20, 3: 30, 4: 40}
for a, b in d.items():
print(a, b)
Run Code Online (Sandbox Code Playgroud)
输出
代码1:
four 4
two 2
three 3
one 1
Run Code Online (Sandbox Code Playgroud)
代码1:
three 3
one 1
two 2
four 4
Run Code Online (Sandbox Code Playgroud)
代码2(总是):
1 10
2 20
3 30
4 40
Run Code Online (Sandbox Code Playgroud) python ×9
dictionary ×7
python-3.x ×2
collections ×1
flask ×1
for-loop ×1
list ×1
mapping ×1
python-3.6 ×1
setdefault ×1
sorting ×1