在 Python 2.7 中,我可以将字典 keys , values 或 items 作为列表:< / p>
>>> newdict = {1:0, 2:0, 3:0}
>>> newdict.keys()
[1, 2, 3]
现在,在 Python&gt; = 3.3 中,我得到这样的结果:
>>> newdict.keys()
dict_keys([1, 2, 3])
所以,我必须这样做才能得到一个清单:
newlist = list()
for i in newdict.keys():
newlist.append(i)
我想知道,有没有更好的方法来返回 Python 3 中的列表?
答案 0 :(得分:649)
尝试list(newdict.keys())
。
这会将dict_keys
对象转换为列表。
另一方面,你应该问问自己是否重要。 Pythonic编码的方法是假设鸭子打字(如果它看起来像鸭子,它像鸭子一样嘎嘎叫,它是鸭子)。对于大多数用途,dict_keys
对象将像列表一样运行。例如:
for key in newdict.keys():
print(key)
显然,插入操作符可能不起作用,但无论如何对字典键列表没有多大意义。
答案 1 :(得分:161)
Python&gt; = 3.5替代方法:解压缩到列表文字 [*newdict]
使用Python 3.5引入了新的unpacking generalizations (PEP 448),现在您可以轻松地执行此操作:
>>> newdict = {1:0, 2:0, 3:0}
>>> [*newdict]
[1, 2, 3]
使用*
解包使用任何可迭代的对象,并且由于字典在迭代时返回其键,因此您可以在列表文字中使用它轻松创建列表。
添加.keys()
,即[*newdict.keys()]
可能有助于使您的意图更加明确,尽管它会花费您进行函数查找和调用。 (说实话,这不是你应该真正担心的事情。)
<子>
*iterable
语法类似于执行list(iterable)
,其行为最初记录在Python参考手册的Calls section中。使用PEP 448,*iterable
可能出现的限制被放宽,允许它也被放置在列表,集合和元组文字中,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}
小心元组中的尾随逗号!
答案 2 :(得分:26)
list(newdict)
适用于Python 2和Python 3,在newdict
中提供了一个简单的键列表。 keys()
没有必要。 (:
答案 3 :(得分:23)
关于“duck typing”定义的一点点 - dict.keys()
返回一个可迭代对象,而不是类似列表的对象。它可以在迭代工作的任何地方工作 - 而不是列表的任何位置。列表也是可迭代的,但是iterable不是列表(或序列......)
在实际使用案例中,与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']]
答案 4 :(得分:11)
您还可以使用列表理解:
>>> 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的实现细节)。
答案 5 :(得分:8)
不使用keys
方法转换为列表使其更具可读性:
list(newdict)
并且,当循环浏览字典时,不需要keys()
:
for key in newdict:
print key
除非您在循环中修改它,否则需要预先创建的键列表:
for key in list(newdict):
del newdict[key]
在Python 2上,使用keys()
可以获得微不足道的性能提升。
答案 6 :(得分:6)
如果您需要单独存储密钥,那么此解决方案需要使用Extended Iterable Unpacking(python3.x +)来进行打字,比迄今为止提供的所有其他解决方案都少。
newdict = {1: 0, 2: 0, 3: 0}
*k, = newdict
k
# [1, 2, 3]
╒═══════════════╤═════════════════════════════════════════╕
│ k = list(d) │ 9 characters (excluding whitespace) │
├───────────────┼─────────────────────────────────────────┤
│ k = [*d] │ 6 characters │
├───────────────┼─────────────────────────────────────────┤
│ *k, = d │ 5 characters │
╘═══════════════╧═════════════════════════════════════════╛
答案 7 :(得分:1)
除了本页提到的方法之外,您还可以使用运营商模块中的itemgetter
:
>>> from operator import itemgetter
>>> list(map(itemgetter(0), dd.items()))
[1, 2, 3]
答案 8 :(得分:1)
您还可以执行[4] pry(main)> "No#xyz1".split("No#")
=> ["", "xyz1"]
[5] pry(main)> "No#xyz1".split("No#").last
=> "xyz1"
或tuple(dict)
:
set(dict)
答案 9 :(得分:0)
list(newdict)
这是最简单的解决方案,就像一个魅力!
答案 10 :(得分:0)
我知道这是一个非常古老的答案,但除了经典(可能更正确)的方法(some_dict.keys()
)之外,还有一种更“酷”且肯定更有趣的方法来做到这一点:
some_dict = { "foo": "bar", "cool": "python!" }
print( [*some_dict] == ["foo", "cool"] ) # True
答案 11 :(得分:-1)
我可以想到两种从字典中提取键的方法。
方法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']
答案 12 :(得分:-1)
这是在一行代码中获取key List的最佳方式
dict_variable = {1:"a",2:"b",3:"c"}
[key_val for key_val in dict_variable.keys()]
答案 13 :(得分:-3)
列表(newdict.keys())
list(newdict.keys())