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

2024-04-20 08:51:05 发布

您现在位置:Python中文网/ 问答频道 /正文

在Python 2.7中,我可以将dictionarykeysvaluesitems作为一个列表:

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

现在,在Python>;=3.3中,我得到这样的结果:

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

所以,我必须这样做才能得到一个列表:

newlist = list()
for i in newdict.keys():
    newlist.append(i)

我想知道,有没有更好的方法返回Python 3中的列表?


Tags: 方法ingt列表foritemskeysdict
3条回答

list(newdict)在Python 2和Python 3中都有效,它提供了newdict中键的简单列表。keys()不是必需的。(:

尝试list(newdict.keys())

这将把dict_keys对象转换为列表。

另一方面,你应该问问自己这是否重要。Pythonic编写代码的方法是假设duck类型(如果它看起来像鸭子,而且嘎嘎叫起来像鸭子,那么它就是鸭子。在大多数情况下,dict_keys对象的作用类似于列表。例如:

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

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

Python>;=3.5备选方案:解压成列表文本[*newdict]

Python 3.5引入了新的unpacking generalizations (PEP 448),使您现在可以轻松地:

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

使用*解包可与任何可iterable对象一起使用,并且,由于字典在遍历时返回它们的键,因此可以通过在列表文本中使用它轻松创建列表。

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

*iterable语法与执行list(iterable)类似,其行为最初记录在Python参考手册的Calls section中。PEP 448放宽了*iterable出现位置的限制,允许它也被放在list、set和tuple文本中,因此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}

小心元组中的尾随逗号!

相关问题 更多 >