字典在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保留插入顺序
假设你有一个Javascript对象,如{'cat':'meow','dog':'woof'...}是否有一种更简洁的方法从对象中选择一个随机属性,而不是我想出的这种漫长的方式:
function pickRandomProperty(obj) {
var prop, len = 0, randomPos, pos = 0;
for (prop in obj) {
if (obj.hasOwnProperty(prop)) {
len += 1;
}
}
randomPos = Math.floor(Math.random() * len);
for (prop in obj) {
if (obj.hasOwnProperty(prop)) {
if (pos === randomPos) {
return prop;
}
pos += 1;
}
}
}
Run Code Online (Sandbox Code Playgroud) 假设您无法通过点表示法访问对象内的某个项目,例如objectName.objectItem它随时间具有随机名称.有没有办法像第二项一样交替访问它?
如何从这个对象中获取item2,只知道它是第二个项目?:
something: {
item1: "text",
item2: "text",
item3: "text:,
...
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试编写一个函数,它遍历字符串列表并返回列表中前 10 个最常用的字符串。我正在尝试为这个问题提出多种解决方案
这是我的第一个解决方案
const list = [
"this",
"is",
"a",
"test",
"which",
"word",
"wins",
"top",
"i",
"don't",
"know",
"off",
"hand",
"do",
"you",
"this",
"a",
"a",
"this",
"test",
"a",
"a",
"do",
"hand",
"hand",
"a",
"whatever",
"what",
"do",
"do"
];
function fn1(strArr) {
const map = new Map()
for(const str of strArr) {
if(map.has(str)) {
map.set(str, map.get(str) + 1)
} else {
map.set(str, 1)
}
}
const sortedMap =[...map.entries()].sort(([_,a], [__,b]) => a < b ? 1 : -1)
return sortedMap.slice(0 , …Run Code Online (Sandbox Code Playgroud) 有谁知道Object.entries()Javascript的复杂性?基于这个问题,我猜想O(n)如果它是通过获取键和值作为数组然后将它们压缩在一起来实现的?
我有两个对象:
var a = {
world: 'Mamba',
planet: 'Oliver'
}
var b = {
world: 'Koko'
}
Run Code Online (Sandbox Code Playgroud)
如何只比较两个对象中存在的属性?在我的例子中,它将是属性"世界".
javascript ×5
object ×2
algorithm ×1
arrays ×1
dictionary ×1
json ×1
python ×1
python-3.6 ×1
python-3.x ×1
v8 ×1