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

本文翻译自:How to return dictionary keys as a list in Python?

In Python 2.7 , I could get dictionary keys , values , or items as a list: Python 2.7中 ,我可以将字典作为列表获取:

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

Now, in Python >= 3.3 , I get something like this: 现在,在Python> = 3.3中 ,我得到如下信息:

>>> newdict.keys()
dict_keys([1, 2, 3])

So, I have to do this to get a list: 因此,我必须这样做以获得列表:

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

I'm wondering, is there a better way to return a list in Python 3 ? 我想知道,是否有更好的方法在Python 3中返回列表?


#1楼

参考:https://stackoom.com/question/18ZRm/如何在Python中将字典键作为列表返回


#2楼

Try list(newdict.keys()) . 尝试list(newdict.keys())

This will convert the dict_keys object to a list. 这会将dict_keys对象转换为列表。

On the other hand, you should ask yourself whether or not it matters. 另一方面,您应该问自己是否重要。 The Pythonic way to code is to assume duck typing ( if it looks like a duck and it quacks like a duck, it's a duck ). Python的编码方式是假设鸭子输入( 如果看起来像鸭子,而像鸭子一样嘎嘎叫,那就是鸭子 )。 The dict_keys object will act like a list for most purposes. dict_keys对象的作用类似于列表。 For instance: 例如:

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

Obviously, insertion operators may not work, but that doesn't make much sense for a list of dictionary keys anyway. 显然,插入运算符可能不起作用,但是对于字典关键字列表而言,这并没有多大意义。


#3楼

A bit off on the "duck typing" definition -- dict.keys() returns an iterable object, not a list-like object. 在“鸭子类型”定义上dict.keys()偏离dict.keys()返回一个可迭代的对象,而不是类似列表的对象。 It will work anywhere an iterable will work -- not any place a list will. 它可以在任何可迭代的地方都可以使用-列表不能在任何地方使用。 a list is also an iterable, but an iterable is NOT a list (or sequence...) 列表也是可迭代的,但可迭代的不是列表(或序列...)

In real use-cases, the most common thing to do with the keys in a dict is to iterate through them, so this makes sense. 在实际的用例中,与字典中的键有关的最常见的事情是遍历它们,因此这很有意义。 And if you do need them as a list you can call list() . 如果确实需要它们作为列表,则可以调用list()

Very similarly for zip() -- in the vast majority of cases, it is iterated through -- why create an entire new list of tuples just to iterate through it and then throw it away again? zip()非常相似-在大多数情况下,它都是经过迭代的-为什么要创建整个元组的新列表只是为了对其进行迭代,然后又将其丢弃?

This is part of a large trend in python to use more iterators (and generators), rather than copies of lists all over the place. 这是python中使用更多迭代器(和生成器)而不是在各处使用列表副本的一种大趋势的一部分。

dict.keys() should work with comprehensions, though -- check carefully for typos or something... it works fine for me: 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楼

list(newdict) works in both Python 2 and Python 3, providing a simple list of the keys in newdict . list(newdict)在Python 2和Python 3中均可使用,提供了newdict中的键的简单列表。 keys() isn't necessary. keys()不是必需的。 (: (:


#5楼

You can also use a list comprehension : 您还可以使用列表推导

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

Or, shorter, 或更短一点

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

Note: Order is not guaranteed on versions under 3.7 (ordering is still only an implementation detail with CPython 3.6). 注意:在3.7版以下的版本中,不能保证订购(订购仍然只是CPython 3.6的实现细节)。


#6楼

Converting to a list without using the keys method makes it more readable: 在不使用keys方法的情况下转换为列表使其更具可读性:

list(newdict)

and, when looping through dictionaries, there's no need for keys() : 并且,当遍历字典时,不需要keys()

for key in newdict:
    print key

unless you are modifying it within the loop which would require a list of keys created beforehand: 除非您要在循环中进行修改,否则将需要预先创建的键列表:

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

On Python 2 there is a marginal performance gain using keys() . 在Python 2上,使用keys()获得少量性能提升

发布了0 篇原创文章 · 获赞 8 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/asdfgh0077/article/details/105554995