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

在Python 2.7中,我可以将字典作为: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


答案 1

这会将对象转换为 :dict_keyslist

list(newdict.keys())

另一方面,你应该问问自己这是否重要。假设鸭子打字是Pythonic的 - 如果它看起来像一只鸭子,它像鸭子一样嘎嘎叫,它就是一只鸭子。可以像迭代对象一样迭代对象。例如:dict_keyslist

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

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


答案 2

Python >= 3.5 替代方案:解压缩到列表文本中 [*newdict]

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

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

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

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

*可迭代语法类似于 do list(可迭代),其行为最初记录在 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}

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