字典在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是否包含以特定字符串开头的键的最快方法是什么?我们能做得比线性好吗?当我们只知道密钥的开头时,我们如何才能实现O(1)操作?
这是当前的解决方案:
for key in dict.keys():
if key.start_with(str):
return True
return False
Run Code Online (Sandbox Code Playgroud) 我有一个包含500万个字符串元素的列表,这些元素存储为pickle对象.
a = ['https://en.wikipedia.org/wiki/Data_structure','https://en.wikipedia.org/wiki/Data_mining','https://en.wikipedia.org/wiki/Statistical_learning_theory','https://en.wikipedia.org/wiki/Machine_learning','https://en.wikipedia.org/wiki/Computer_science','https://en.wikipedia.org/wiki/Information_theory','https://en.wikipedia.org/wiki/Statistics','https://en.wikipedia.org/wiki/Mathematics','https://en.wikipedia.org/wiki/Signal_processing','https://en.wikipedia.org/wiki/Sorting_algorithm','https://en.wikipedia.org/wiki/Data_structure','https://en.wikipedia.org/wiki/Quicksort','https://en.wikipedia.org/wiki/Merge_sort','https://en.wikipedia.org/wiki/Heapsort','https://en.wikipedia.org/wiki/Insertion_sort','https://en.wikipedia.org/wiki/Introsort','https://en.wikipedia.org/wiki/Selection_sort','https://en.wikipedia.org/wiki/Timsort','https://en.wikipedia.org/wiki/Cubesort','https://en.wikipedia.org/wiki/Shellsort']
Run Code Online (Sandbox Code Playgroud)
为了删除重复项,我使用set(a),然后我再次通过列表list(set(a)).
我的问题是:
即使我重新启动python,并从pickle文件中读取列表,list(set(a))每次的顺序是否相同?
我很想知道这个哈希 - >列表排序是如何工作的.
我测试了一个小数据集,它似乎有一致的排序.
In [50]: a = ['x','y','z','k']
In [51]: a
['x', 'y', 'z', 'k']
In [52]: list(set(a))
['y', 'x', 'k', 'z']
In [53]: b=list(set(a))
In [54]: list(set(b))
['y', 'x', 'k', 'z']
In [55]: del b
In [56]: b=list(set(a))
In [57]: b
['y', 'x', 'k', 'z']
Run Code Online (Sandbox Code Playgroud) 是python代码
for key in dict:
...
Run Code Online (Sandbox Code Playgroud)
,dictdict数据类型在哪里,总是以regrard的固定顺序迭代到key?例如,假设dict={"aaa":1,"bbb",2}上面的代码总是先让key="aaa"(然后key="bbb"是另一个固定的顺序)?订单是否可能是随机的?我在ubuntu 13中使用python 3.3,让我们假设这个运行环境不会改变.谢谢.
添加一件事:在多次运行期间,变量dict保持不变,即生成一次并多次读取.
令人讨厌的是,以下方法不起作用:
from collections import Counter
import random
c = Counter([1,1,1,1,0,0])
random.choice(c) # I expect this to return 1 with probability 2/3,
# and 0 with probability 1/3.
# It actually returns 4 or 2, with probability 1/2
Run Code Online (Sandbox Code Playgroud)
在 Python(任何版本)中从多重集采样的惯用方法是什么?
编辑是的,我确实需要使用多重集。我的实际数据要大得多,仅将其存储在列表中是不切实际的。
编辑 2我需要以合理的效率执行此操作,因为我的代码将重复执行此操作。Counter 对象中将存储大量数据,任何涉及将所有这些数据复制到新数据结构的操作都不是可行的解决方案。
我正在尝试从一些教程中学习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()从字典中提取密钥并按照我认为的顺序迭代它,那会导致不匹配问题吗?
我有一堂课
class Challenge():
difficulty = Field(type=float)
category = Field(type=str)
Run Code Online (Sandbox Code Playgroud)
我有一个想以自定义方式排序的Challenge对象的列表:我想按自定义顺序对难度进行排序,然后针对每个难度,我要按类别对对象进行排序,每个难度都按不同的自定义顺序进行排序困难。
我已经有一个字典,其中按顺序列出了难度,对于每个难度,则列出了类别的排序。我需要将此排序应用于列表,但我不知道如何将这些条件应用于排序。
我到了这一点:
found_challenges.sort(key=lambda x: (x.difficulty, x.category))
Run Code Online (Sandbox Code Playgroud)
显然,这不是按照我想排序的方式排序。如何将这些自定义条件应用于列表排序?
例:
ch_1 = Challenge(difficulty=1.0, category='one')
ch_2 = Challenge(difficulty=1.0, category='two')
ch_3 = Challenge(difficulty=2.0, category='one')
ch_4 = Challenge(difficulty=2.0, category='two')
Run Code Online (Sandbox Code Playgroud)
而订购字典是
{
2.0: ['one', 'two'],
1.0: ['two', 'one']
}
Run Code Online (Sandbox Code Playgroud)
因此排序应为:
[ch_3, ch_4, ch_2, ch_1]
Run Code Online (Sandbox Code Playgroud) 使用Python 2.7.想确认我们不能假设.keys()方法以有序的方式(例如升序)返回字典的键(作为列表)?试了几个样品,并且总是返回有序列表,所以想要双重确认.Python官方文档没有提到与订单相关的东西.