it-swarm.dev

如何在Python中将字典键作为列表返回?

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])

所以,我必须这样做以获得一个列表:

newlist = list()
for i in newdict.keys():
    newlist.append(i)

我想知道,有没有更好的方法来返回 Python 3中的列表

488
user2015601

试试list(newdict.keys())

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

另一方面,你应该问问自己是否重要。 Pythonic的编码方式是假设鸭子打字( 如果它看起来像一只鸭子,它像鸭子一样嘎嘎叫,它是一只鸭子 )。 dict_keys对象将作为大多数用途的列表。例如:

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

显然,插入操作符可能不起作用,但无论如何这对字典键列表没有多大意义。

635
Chris

Python> = 3.5替代方法:解压缩到列表文字 [*newdict]

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

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

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

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

*iterable语法类似于执行list(iterable),其行为最初记录在Python参考手册的 Calls部分 中。使用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}

提防Tuple案件中的尾随逗号!

155
Jim Fasarakis Hilliard

list(newdict)在Python 2和Python 3中都有效,提供newdict中键的简单列表。 keys()不是必需的。 (:

26
Seb

关于“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']]
23
Chris Barker

你也可以使用 list comprehension

>>> 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上,使用 keys()有一个边际性能增益。

8
Cas

如果你需要单独存储密钥,这里的解决方案需要的输入比目前为止提供的每个其他解决方案都少,使用 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                          │
            ╘═══════════════╧═════════════════════════════════════════╛
6
cs95

除了本页提到的方法之外,您还可以使用运算符模块中的itemgetter

>>> from operator import itemgetter
>>> list(map(itemgetter(0), dd.items()))
[1, 2, 3]
1
SuperNova

你也可以做Tuple(dict)set(dict)

>>> list(set(newdict))
[1, 2, 3]
>>> list(Tuple(newdict))
[1, 2, 3]
1
SuperNova