http://btmiller.com/2015/04/13/get-list-of-keys-from-dictionary-in-python-2-and-3.html

Get a List of Keys From a Dictionary in Both Python 2 and Python 3

It was mentioned in an earlier post that there is a difference in how the keys() operation behaves between Python 2 and Python 3. If you’re adapting your Python 2 code to Python 3 (which you should), it will throw a TypeError when you try to operate on keys() like a list. So, if you depend on getting a list returned from keys(), here’s how to make it work for both Python 2 and Python 3.

In Python 2, simply calling keys() on a dictionary object will return what you expect:

$ python
>>> foo = { 'bar': "hello", 'baz': "world" }
>>> type(foo.keys())
<type 'list'>
>>> foo.keys()
['baz', 'bar']
>>> foo.keys()[0]
'baz'

That’s great, however, in Python 3, keys() no longer returns a list, but a view object:

The objects returned by dict.keys()dict.values() and dict.items() are view objects. They provide a dynamic view on the dictionary’s entries, which means that when the dictionary changes, the view reflects these changes.

The dict_keys object is an iterator and looks a lot more like a set than a list. So using the same call in Python 3 would produce this result:

$ python3
>>> foo = { 'bar': "hello", 'baz': "world" }
>>> type(foo.keys())
<class 'dict_keys'>
>>> foo.keys()
dict_keys(['baz', 'bar'])
>>> foo.keys()[0]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'dict_keys' object does not support indexing

The TypeError can be avoided and compatibility can be maintained by simply converting the dict_keys object into a list which can then be indexed as normal in both Python 2 and Python 3:

$ python3
>>> foo = { 'bar': "hello", 'baz': "world" }
>>> type(list(foo.keys()))
<class 'list'>
>>> list(foo.keys())
['baz', 'bar']
>>> list(foo.keys())[0]
'baz'

And just for good measure, here it is in Python 2:

$ python
>>> foo = { 'bar': "hello", 'baz': "world" }
>>> type(list(foo.keys()))
<class 'list'>
>>> list(foo.keys())
['baz', 'bar']
>>> list(foo.keys())[0]
'baz'

http://stackoverflow.com/questions/16819222/how-to-return-dictionary-keys-as-a-list-in-python-3-3

I noticed something very weird - or let's say, something that is very different from Python 2.7 and older versions of Python 3 I believe.

Previously, I could get dictionary keys, values, or items of a dictionary very easily as list:

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

Now, I get something like this in

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

I am wondering if there is a way to return a list as I showed it in the Python 2.7 example. Because now, I have to do something like

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

EDIT:

Thanks, list(newdict.keys()) works as I wanted!

But there is another thing that bugs me now: I want to create a list of reversed dictionary keys and values to sort them by values. Like so (okay, this is a bad example, because the values are all 0 here)

>>> zip(newdict.values(), newdict.keys())
[(0, 1), (0, 2), (0, 3)]

However, in Python3 I get something like

>>> zip(list(newdict.keys()), list(newdict.values()))
<zip object at 0x7f367c7df488>

Okay, sorry, I just figured out that you have to use a list() function around zip() too.

list(zip(newdict.values(), newdict.keys()))
[(0, 1), (0, 2), (0, 3)]

This is really something one has to get used to

asked May 29 '13 at 16:24
 
user2015601

 
 
1  
If you're trying to sort a dictionary by values, try this oneliner: sorted(newdict.item‌​s(),key=lambda x: x[1])newdict.items() returns the key-value pairs as tuples (just like you're doing with the zip above).sorted is the built-in sort function and it permits a key parameter which should be a function that transforms each list element into the value which should be used to sort. – ChrisMay 29 '13 at 17:33 
    
Looks very handy, thanks! – user2015601 May 29 '13 at 18:54
    
Interesting thread safety issue regarding this topic is here: blog.labix.org/2008/06/27/… – Paul May 10 at 18:00

3 Answers

Try list(newdict.keys()).

This wil convert the dict_keys object to a list.

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). the dict_keys object will act like a list for most purposes. 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.

answered May 29 '13 at 16:25
Chris

1,787714
 
    
Thank you for the quick response, it works! Regarding the second part of your answer: I think it matters for what I want to do with the list(s), I updated my question under the EDIT section. Thanks! – user2015601 May 29 '13 at 16:31 
1  
newdict.keys() does not support indexing – Miguel de Val-Borro Sep 10 '14 at 17:54
5  
list(newdict) also works (at least in python 3.4). Is there any reason to use the .keys() method? – naught101 Mar 31 '15 at 11:58 

How to return dictionary keys as a list in Python 3.3的更多相关文章

  1. Python 字典(Dictionary) keys()方法

    Python 字典(Dictionary) keys() 函数以列表返回一个字典所有的键. 语法 keys()方法语法: dict.keys() 参数 NA. 返回值 返回一个字典所有的键. 实例 以 ...

  2. 【RF库Collections测试】Get Dictionary Keys

    Name:Get Dictionary KeysSource:Collections <test library>Arguments:[ dictionary ]Returns `keys ...

  3. c# LRU实现的缓存类

    在网上找到网友中的方法,将其修改整理后,实现了缓存量控制以及时间控制,如果开启缓存时间控制,会降低效率. 定义枚举,移除时使用 public enum RemoveType    {        [ ...

  4. Java自定义一个字典类(Dictionary)

    标准Java库只包含Dictionary的一个变种,名为:Hashtable.(散列表) Java的散列表具有与AssocArray相同的接口(因为两者都是从Dictionary继承来的).但有一个方 ...

  5. 字典集合Dictionary<K,V>和构造的应用==>>体检套餐项目

    效果 首先,我们先来准备我们需要的类 1.检查项目类 using System; using System.Collections.Generic; using System.Linq; using ...

  6. Python dictionary implementation

    Python dictionary implementation http://www.laurentluce.com/posts/python-dictionary-implementation/ ...

  7. 自定义Dictionary支持线程安全

    本文转载:http://www.cnblogs.com/kiddo/archive/2008/09/25/1299089.html 我们说一个数据结构是线程安全指的是同一时间只有一个线程可以改写它.这 ...

  8. javascript字典数据结构Dictionary实现

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat=&qu ...

  9. JavaScript 字典(Dictionary)

    TypeScript方式实现源码 //  set(key,value):向字典中添加新元素. //  remove(key):通过使用键值来从字典中移除键值对应的数据值. //  has(key ...

随机推荐

  1. Docker镜像

    docker镜像123? 额,由于没有实验环境,没有亲手实践,因此理解可能有不对的地方. 反正也是学习笔记,以后再修改吧... docker的镜像跟virtualbox的镜像不一样.在虚拟机中,镜像是 ...

  2. Atitit 代理CGLIB 动态代理 AspectJ静态代理区别

    Atitit 代理CGLIB 动态代理 AspectJ静态代理区别 1.1. AOP 代理主要分为静态代理和动态代理两大类,静态代理以 AspectJ 为代表:而动态代理则以 spring AOP 为 ...

  3. Linux初学 - SSH

    SSH:SSH 为 Secure Shell 的缩写,由 IETF 的网络小组(Network Working Group)所制定:SSH 为建立在应用层和传输层基础上的安全协议.SSH 是目前较可靠 ...

  4. SQL SERVER 2005/2008 中关于架构的理解(二)

    本文上接SQL SERVER 2005/2008 中关于架构的理解(一)      架构的作用与示例 用户与架构(schema)分开,让数据库内各对象不再绑在某个用户账号上,可以解决SQL SERVE ...

  5. 每天一个linux命令(26):用SecureCRT来上传和下载文件

    用SSH管理linux服务器时经常需要远程与本地之间交互文件.而直接用SecureCRT自带的上传下载功能无疑是最方便的,SecureCRT下的文件传输协议有ASCII.Xmodem.Zmodem. ...

  6. js const

    js const const 声明创建一个只读的常量.这不意味着常量指向的值不可变,而是变量标识符的值只能赋值一次. const state = { notes: [], activeNote: {} ...

  7. BrowserSync前端调试工具使用

    上次介绍了一款DebugGap移动端调试工具DebugGap推荐.但是这几天使用了之后感觉还是有些不足,尤其是里面的调试工具虽然和Chrome里面的调试长的很像,但是多少有些不同,使用起来还是不太方便 ...

  8. SSIS连接SAPBI

        SSIS默认的连接管理器是没有连接到Oracle或SAPBI的,因此如果希望SSIS调用SAP RFC的话,可以使用微软提供的连接管理器插件.     有关这一点的详细信息可以参考MSDN的官 ...

  9. [WPF]有滑动效果的进度条

    先给各位看看效果,可能不太完美,不过效果还是可行的. 我觉得,可能直接放个GIF图片上去会更好. 我这个不是用图片,而是用DrawingBrush画出来的.接着重做ProgressBar控件的模板,把 ...

  10. 解决firefox和IE9对icon font字体的跨域访问问题

    何为跨域访问,为什么会有跨域限制?一切还得从浏览器的同源策略说起. 同源策略:是浏览器最核心也是最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能会受到影响,可以说Web是构建在同源策略基础 ...