私信  •  关注

Jim Fasarakis Hilliard Cas

Jim Fasarakis Hilliard Cas 最近创建的主题
Jim Fasarakis Hilliard Cas 最近回复了
6 年前
回复了 Jim Fasarakis Hilliard Cas 创建的主题 » 迭代python字典[重复]

转换为列表而不使用 keys 方法使其更具可读性:

list(newdict)

而且,当翻阅字典时,不需要 keys() :

for key in newdict:
    print key

除非您在循环中修改它,这需要预先创建的键列表:

for key in list(newdict):
    del newdict[key]

在Python2上,使用 keys() .

6 年前
回复了 Jim Fasarakis Hilliard Cas 创建的主题 » 迭代python字典[重复]

python>=3.5可选:解包到列表文本中 [*newdict]

新的 unpacking generalizations (PEP 448) 与python 3.5一起引入,现在您可以轻松地执行以下操作:

>>> newdict = {1:0, 2:0, 3:0}
>>> [*newdict]
[1, 2, 3]

打开包装 * 与一起工作 任何 对象,它是可Iterable的,并且由于字典在遍历时返回它们的键,所以您可以通过在列表文本中使用它轻松地创建列表。

添加 .keys() [*newdict.keys()] 可能有助于使您的意图更明确一点,尽管这会使您损失函数查找和调用。(老实说,这不是你应该做的事 真正地 担心)。

这个 *iterable 语法类似于 list(iterable) 其行为最初记录在 Calls section python参考手册。在PEP 448中,限制 *无法识别 可能出现的是松动的,允许它也被放在列表、集合和元组文本中,参考手册 Expression lists 也更新了以说明这一点。


虽然相当于 list(newdict) 不同的是,它更快(至少对于小字典而言),因为实际上没有执行函数调用:

%timeit [*newdict]
1000000 loops, best of 3: 249 ns per loop

%timeit list(newdict)
1000000 loops, best of 3: 508 ns per loop

%timeit [k for k in newdict]
1000000 loops, best of 3: 574 ns per loop

对于较大的字典,速度几乎是相同的(遍历大型集合的开销比函数调用的成本小)。


以类似的方式,您可以创建元组和字典键集:

>>> *newdict,
(1, 2, 3)
>>> {*newdict}
{1, 2, 3}

注意元组中的尾随逗号!

6 年前
回复了 Jim Fasarakis Hilliard Cas 创建的主题 » 迭代python字典[重复]

尝试 list(newdict.keys()) .

这将转换 dict_keys 对象到列表。

另一方面,你应该问问自己这是否重要。编写代码的方法是假设duck输入法( 如果它看起来像一只鸭子,像一只鸭子嘎嘎叫,那就是一只鸭子。 )这个 听写键 对象在大多数情况下都像一个列表。例如:

for key in newdict.keys():
  print(key)

显然,插入操作符可能不起作用,但对于字典键列表来说,这没有多大意义。