1101

Python 2.7中,我可以将字典keysvaluesitems作为列表:

>>> 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中返回一个列表?

4

11 回答 11

1370

试试list(newdict.keys())

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

另一方面,你应该问问自己这是否重要。Pythonic 的编码方式是假设鸭子类型(如果它看起来像鸭子并且它像鸭子一样嘎嘎叫,那就是鸭子)。对于大多数目的,该dict_keys对象将充当列表。例如:

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

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

于 2013-05-29T16:25:40.847 回答
447

Python >= 3.5 替代方案:解压成列表文字 [*newdict]

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

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

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

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

*iterable语法类似于doing , 其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}

当心元组案例中的尾随逗号!

于 2017-07-22T10:57:32.070 回答
63

list(newdict)适用于 Python 2 和 Python 3,提供newdict. keys()没有必要。

于 2017-02-14T20:06:49.233 回答
32

您还可以使用列表推导

>>> 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 的实现细节)。

于 2017-03-08T07:49:32.697 回答
29

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

在实际用例中,与 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']]
于 2015-03-04T23:58:05.050 回答
16

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

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

k
# [1, 2, 3]

手术 不。字符数
k = list(d) 9 个字符(不包括空格)
k = [*d] 6 个字符
*k, = d 5 个字符
于 2019-04-01T05:39:36.170 回答
14

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

list(newdict)

并且,在遍历字典时,不需要keys()

for key in newdict:
    print key

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

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

在 Python 2 上,使用keys().

于 2017-03-16T18:15:21.200 回答
5

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

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

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

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

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']
于 2019-11-20T06:55:06.853 回答
3

我知道这是一个非常古老的答案,但除了经典(可能更正确)的方法(some_dict.keys())之外,还有一种更“酷”且肯定更有趣的方法:

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

注意:此解决方案不应在开发环境中使用;*我在这里展示它只是因为我认为从-operator-over-dictionary 的角度来看它很有趣。另外,我不确定这是否是一个记录的功能,它的行为可能会在以后的版本中改变:)

于 2021-03-19T15:03:42.260 回答
0

是的,在 python3.X 中有一个更好和最简单的方法来做到这一点

使用 inbuild list() 函数

#Devil
newdict = {1:0, 2:0, 3:0}
key_list = list(newdict)
print(key_list) 
#[1, 2, 3] 
于 2022-03-03T11:24:04.413 回答
-1

这是在一行代码中获取密钥列表的最佳方式

dict_variable = {1:"a",2:"b",3:"c"}  
[key_val for key_val in dict_variable.keys()]
于 2021-06-26T06:24:40.243 回答