使用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获得一个简单的键列表?


当前回答

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

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

k
# [1, 2, 3]

Operation no. Of characters
k = list(d) 9 characters (excluding whitespace)
k = [*d] 6 characters
*k, = d 5 characters

其他回答

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

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

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

方法二:- 创建一个空列表,然后通过循环将键附加到列表中。 您也可以使用此循环获取值(仅使用.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']

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

有点偏离“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']]

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

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

k
# [1, 2, 3]

Operation no. Of characters
k = list(d) 9 characters (excluding whitespace)
k = [*d] 6 characters
*k, = d 5 characters

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

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

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