'dict_values' object does not support indexing, Python字典dict中由value查key
Python字典dict中由value查key
众所周知,字典dict最大的好处就是查找或插入的速度极快,并且不想列表list一样,随着key的增加越来越复杂。但是dict需要占用较大的内存空间,换句话说,字典dict是以空间换速度。详细请见如下示例:
#------------------------------------------------------------------------------------
student = {'小萌': '1001', '小智': '1002', '小强': '1003', '小明': '1004'}
#------------------------------------------------------------------------------------
由key查value很简单,直接调用:dict ['key'],如下:
#-----------------------------------------------------------------------------------
>>> student ['小强']
结果显示:'1003'
#-----------------------------------------------------------------------------------
但如果此时,我们想由value查找key,则会相对复杂一点,一般来说可通过如下3种方式实现:
#-----------------------------------------------------------------------------------
A. 充分利用 keys() 、values()、index() 函数
>>> list (student.keys()) [list (student.values()).index ('1004')]
结果显示: '小明'
#-----------------------------------------------------------------------------------
B. 通过定义get_key函数的方式
>>> def get_key (dict, value):
return [k for k, v in dict.items() if v == value]
>>> get_key (student, '1002')
结果显示:'小智'
#-----------------------------------------------------------------------------------
C. 将原字典dict进行反转得新字典new_dict,由原来的K-V存储形式,变为V-K存储形式
>>> new_dict = {v : k for k, v in dict.items()}
>>> new_dict ['1001']
结果显示:'小萌'
#-----------------------------------------------------------------------------------
虽然我们可以通过以上方式获得由value查找key的目的,但是我们必须明确一点:在字典dict中,key值是唯一的,且不可变;而value可以随意取值,且不唯一。之所以强调这一点,是因为在利用上述方法时,会出现失效的情况。如下所示:
假设此时原字典student发生了一些变化,变为:
#-----------------------------------------------------------------------------------
student = {'小萌': '1001', '小智': '1002', '小强': '1003', '小明': ['1004', '1005']}
#-----------------------------------------------------------------------------------
那么再次调用上述3种方法,由value查key时,则出现:
#-----------------------------------------------------------------------------------
>>> list (student.keys()) [list (student.values()).index ('1004')]
结果显示:ValueError: '1004' is not in list
因为value不唯一,key—'小明' 对应了两个value,且他们以list形式存储着,所以如果只取其中一个value值是无法查找对应的key值,必须将多个value值组成的list视为一个整体,即:
>>> list (student.keys()) [list (student.values()).index (['1004', '1005'])]
结果显示:'小明'
#-----------------------------------------------------------------------------------
>>> def get_key (dict, value):
return [k for k, v in dict.items() if v == value]
>>> get_key (student, '1004')
结果显示:[ ]
>>> get_key (student, ['1004', '1005'])
结果显示:'小明'
#-----------------------------------------------------------------------------------
>>> new_dict = {v : k for k, v in dict.items()}
回车后系统报错:TypeError: unhashable type: 'list'
由于key不可变且唯一,当K-V反转以后,key—'小明' 对应了两个value组成的list,反过来就变成了key,即此时由list充当key,因为list是可变动的,所以这在Python中是不允许的。
python中dict根据value找到keyname
'dict_values' object does not support indexing
In Python 3, dict.values() (along with dict.keys() and dict.items()) returns a view, rather than a list. See the documentation here. You therefore need to wrap your call to dict.values() in a call to list like so:
v = list(d.values())
{names[i]:v[i] for i in range(len(names))}
The immediate answer is that a dict's values method returns a non-indexable object, as the error indicates. You can get around that by passing to to list:
list(word_centroid_map.values())
But really you'd do better to rewrite your loop like this:
for key, value word_centroid_map.items():
if value == cluster:
words.append(key)
Or even better, use a list comprehension:
words = [k for k, v in word_centroid_map.items() if v == cluster]
'dict_values' object does not support indexing, Python字典dict中由value查key的更多相关文章
- appium 与 selenium python解决python 'WebElement' object does not support indexing 报错问题问题
再用selenium编写测试脚本时,发现出现python 'WebElement' object does not support indexing 报错问题问题,再找一些解决方法时,发现Appium ...
- django 'set' object does not support indexing
在定义Model之后使用syncdb 同步的时候报出这个错误,检查之后发现是用错了.在model的Meta里面,排序这些用的应该是 ordering = ['last','first','middle ...
- python字典dict的增、删、改、查操作
## python字典dict的增.删.改.查操作dict = {'age': 18, 'name': 'jin', 'sex': 'male', }#增# dict['heigh'] = 185 # ...
- Python 字典 dict() 函数
描述 Python 字典 dict() 函数用于创建一个新的字典,用法与 Pyhon 字典 update() 方法相似. 语法 dict() 函数函数语法: dict(key/value) 参数说明: ...
- python 字典dict - python基础入门(15)
前面的课程讲解了字符串str/列表list/元组tuple,还有最后一种比较重要的数据类型也需要介绍介绍,那就是python字典,俗称:dict. python中的字典可与字符串/列表/元组不同,因为 ...
- Python——字典dict()详解
一.字典 字典是Python提供的一种数据类型,用于存放有映射关系的数据,字典相当于两组数据,其中一组是key,是关键数据(程序对字典的操作都是基于key),另一组数据是value,可以通过key来进 ...
- Python笔记·第六章——字典 (dict) 的增删改查及其他方法
字典是python中唯一的映射类型,采用键值对(key-value)的形式存储数据.python对key进行哈希函数运算,根据计算的结果决定value的存储地址,所以字典是无序存储的,且key必须是可 ...
- Python字典 (dict)
作者博文地址:http://www.cnblogs.com/spiritman/ 字典是Python语言中唯一的映射类型.字典对象是可变的,它是一个容器类型,支持异构.任意嵌套. 创建字典 语法:{k ...
- Python字典(dict)使用技巧
字典dict是Python中使用频率非常高的数据结构,关于它的使用,也有许多的小技巧,掌握这些小技巧会让你高效地的使用dict,也会让你的代码更简洁. 1.默认值 假设name_for_userid存 ...
随机推荐
- 【Mysql优化】MySQL Profiling 的使用
要想优化一条 Query,我们就需要清楚的知道这条 Query 的性能瓶颈到底在哪里,是消耗的 CPU计算太多,还是需要的的 IO 操作太多?要想能够清楚的了解这些信息,在 MySQL 5.0 和 M ...
- 在ubuntu 上面安装ubuntu touch 模拟器
Canonical 公司已经发布了一个运行着Unity8和Mir的Ubuntu Touch模拟器.虽然有一些bug,例如在64位的系统上会使系统崩溃,但我们相信这些都会被一 一修复,这篇文章将教大家如 ...
- tmux下make menuconfig背景色不正常问题
参考https://blog.tankywoo.com/2015/10/24/tmux-mutt-not-redraw-problem.html 是由于~/.bashrc或~/.zshrc设置,覆盖了 ...
- SuSE Linux10.1 网络设置以及和主机通信
SuSE Linux10.1 网络设置以及和主机通信 http://www.cnblogs.com/kevintian/articles/1086994.html 在VMWare上安装好SuSE之后, ...
- 爬取genome的网页和图片
# -*- coding: utf-8 -*- # @Time : 2018/03/08 10:32 # @Author : cxa # @File : gethtmlandimg.py # @Sof ...
- 自建yum镜像
#!/usr/bin/python #-*- coding: utf-8 -*- import requests import sys,logging,traceback from bs4 impor ...
- 运行HelloWorld.class是报错(错误: 找不到或无法加载主类 HelloWorld.class)
1.从毕业到现在工作了几个月了,每天都是在写一些js代码,感觉作为一个web程序员,java还是十分重要的,于是自己买了一本java书来边学边练习,然后发现自己连使用记事本来编写的HelloWorld ...
- WPF中添加一个文本输入框,按Enter回车,执行绑定的Command
在WPF+WMMV模式中使用键盘和鼠标事件的绑定代码如下: <TextBox x:Name="SearchBox" Text="{Binding SearchTex ...
- 【C++】多重继承
1. 多重继承时的二义性 当使用多重继承时,如果多个父类都定义了相同名字的变量,则会出现二义性.解决方法:使用 :: 声明作用域 #include <iostream> using nam ...
- redis持久化的方法及对比
1.持久化的作用 redis所有的数据保持在内存中,对数据的更新将异步的保存到磁盘上. 两种方式: 2.RDB 2.1.概念 2.2.触发机制 2.2.1.save 同步 因为是同步命令,数据量大的话 ...