使用Python 2.7,我可以以列表的形式获取字典的键、值或项:

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

使用Python >= 3.3,我得到:

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

如何使用Python 3获得一个简单的键列表?


当前回答

这是在一行代码中获得key List的最佳方法

dict_variable = {1:"a",2:"b",3:"c"}  
[key_val for key_val in dict_variable.keys()]

其他回答

Python >= 3.5 alternative: unpack into list literal [*newdict]

Python 3.5引入了新的解包泛化(PEP 448),允许您现在轻松地执行:

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

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

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

*iterable语法类似于doing list(iterable),它的行为最初记录在Python参考手册的Calls部分。在PEP 448中,对*iterable出现位置的限制放宽了,允许它也被放置在list, set和tuple文字中,表达式列表的参考手册也更新了这一点。


虽然相当于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}

注意在元组情况下的尾随逗号!

有点偏离“duck typing”定义——dict.keys()返回一个可迭代对象,而不是一个类似列表的对象。它可以在iterable可以工作的任何地方工作——而不是在list可以工作的任何地方。列表也是可迭代对象,但可迭代对象不是列表(或序列…)

在实际用例中,使用dict中的键最常见的事情是遍历它们,因此这是有意义的。如果你确实需要它们作为列表,你可以调用list()。

与zip()非常相似——在绝大多数情况下,它都是遍历的——为什么要创建一个全新的元组列表,只是为了遍历它,然后又把它扔掉呢?

这是python使用更多迭代器(和生成器)的大趋势的一部分,而不是到处都是列表的副本。

Dict.keys()应该与推导式一起工作,不过要仔细检查是否有错别字之类的……这对我来说很有效:

>>> d = dict(zip(['Sounder V Depth, F', 'Vessel Latitude, Degrees-Minutes'], [None, None]))
>>> [key.split(", ") for key in d.keys()]
[['Sounder V Depth', 'F'], ['Vessel Latitude', 'Degrees-Minutes']]

这将把dict_keys对象转换为一个列表:

list(newdict.keys())

另一方面,你应该问问自己这是否重要。假设鸭子输入是python式的——如果它看起来像一只鸭子,它的叫声像一只鸭子,它就是一只鸭子。dict_keys对象可以像列表一样迭代。例如:

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

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

list(newdict)在Python 2和Python 3中都可以使用,在newdict中提供一个简单的键列表。Keys()不是必需的。

除了经典(可能更正确)的方法(some_dict.keys())之外,还有一种更“酷”且肯定更有趣的方法:

some_dict = { "foo": "bar", "cool": "python!" }
print( [*some_dict] == ["foo", "cool"] )         # True  

注意:这个解决方案不应该在开发环境中使用;我在这里展示它只是因为我认为从*-操作符-字典的角度来看它非常有趣。此外,我不确定这是否是一个文档化的功能,它的行为可能会在以后的版本中改变:)