如何在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键?

1812422 次浏览

这将把dict_keys对象转换为list

list(newdict.keys())

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

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

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

关于“鸭子类型”定义的一点-dict.keys()返回一个可迭代对象,而不是类似列表的对象。它将在可迭代对象工作的任何地方工作-而不是列表的任何地方。列表也是可迭代的,但可迭代不是列表(或序列…)

在实际的用例中,使用字典中的键最常见的做法是遍历它们,所以这是有意义的。如果您确实需要它们作为列表,您可以调用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']]

list(newdict)适用于Python 2和Python 3,提供了newdict中键的简单列表。keys()不是必需的。

您也可以使用列表理解

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

或者更短,

>>> [k  for  k in  newdict][1, 2, 3]

注意:在3.7以下的版本上不保证顺序(排序仍然只是CPython 3.6的实现细节)。

在不使用keys方法的情况下转换为列表使其更具可读性:

list(newdict)

而且,当循环遍历字典时,不需要keys()

for key in newdict:print key

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

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

在Python 2上,使用#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}

小心元组中的尾随逗号!

如果您需要单独存储密钥,这里有一个解决方案,它需要比迄今为止提出的其他解决方案更少的键入,使用扩展可迭代解包(Python3. x+):

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

操作没有字符
k = list(d)9个字符(不包括空格)
k = [*d]6个字符
*k, = d5个字符

我能想到两种从字典中提取键的方法。

方法1:-使用. key()方法获取密钥,然后将其转换为列表。

some_dict = {1: 'one', 2: 'two', 3: 'three'}list_of_keys = list(some_dict.keys())print(list_of_keys)-->[1,2,3]

方法2:-创建一个空列表,然后通过循环将键附加到列表中。您也可以使用此循环获取值(仅使用. key()进行键,使用.项目()进行键和值提取)

list_of_keys = []list_of_values = []for key,val in some_dict.items():list_of_keys.append(key)list_of_values.append(val)
print(list_of_keys)-->[1,2,3]
print(list_of_values)-->['one','two','three']

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

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

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

这是在一行代码中获取键列表的最佳方法

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

是的,在python3. X中有一种更好、最简单的方法可以做到这一点


使用inbuild list()函数

#Devilnewdict = {1:0, 2:0, 3:0}key_list = list(newdict)print(key_list)#[1, 2, 3]

你可以使用下面的简单方法

keys = newdict.keys()print(keys)