如何在 Python 中将字典键作为列表返回?

新手上路,请多包涵

使用 Python 2.7,我可以将字典 keysvaluesitems 获取为 list

 >>> newdict = {1:0, 2:0, 3:0}
>>> newdict.keys()
[1, 2, 3]

使用 Python >= 3.3,我得到:

 >>> newdict.keys()
dict_keys([1, 2, 3])

如何使用 Python 3 获得简单的 list 键?

原文由 user2015601 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 519
2 个回答

这会将 dict_keys 对象转换为 list

 list(newdict.keys())


另一方面,你应该问问自己这是否重要。假设 鸭子类型 是 Pythonic —— _如果它看起来像鸭子并且它像鸭子一样嘎嘎叫,那么它就是鸭子_。 dict_keys 对象可以像 list 一样被 迭代。例如:

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

请注意 dict_keys 不支持插入 newdict[k] = v ,尽管您可能不需要它。

原文由 Chris 发布,翻译遵循 CC BY-SA 4.0 许可协议

Python >= 3.5 备选方案:解压为列表文字 [*newdict]

Python 3.5 引入了新的 解包泛化 (PEP 448) ,使您现在可以轻松地执行以下操作:

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

使用 * 解包适用于 任何 可迭代的对象,并且由于字典在迭代时返回它们的键,您可以通过在列表文字中使用它来轻松创建列表。

添加 .keys()[*newdict.keys()] 可能有助于使您的意图更加明确,尽管这将花费您查找和调用函数的费用。 (老实说,这不是您 真正 应该担心的事情)。

*iterable 语法类似于执行 list(iterable) 其行为最初记录在 Python 参考手册的 调用部分。在 PEP 448 中,对 *iterable 可能出现的位置的限制被放宽,允许它也被放置在列表、集合和元组文字中, 表达式列表 的参考手册也已更新以说明这一点。


虽然等同于 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}

当心元组大小写中的尾随逗号!

原文由 Dimitris Fasarakis Hilliard 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题