深入理解Python中字典的键的使用

字典的键

字典中的值没有任何限制, 可以是任意Python对象,即从标准对象到用户自定义对象皆可,但是字典中的键是有类型限制的。
(1)不允许一个键对应多个值
        必须明确一条原则:每个键只能对应一个项。也就是说:一键对应多个值是不允许的(像列表、元组和其他字典这样的容器对象是可以的)。 当有键发生冲突(即字典键重复赋值),取最后(最近)的赋值。Python并不会因字典中的键存在冲突而产生一个错误,它不会检查键的冲突是因为如果真这样做的话,在每个键-值对赋值的时候都会做检查,这将会占用一定量的内存。

  >>> dict1 = {'foo':789, 'foo': 'xyz'}
  >>> dict1
  {'foo': 'xyz'}
  >>> dict1['foo'] = 123
  >>> dict1
  {'foo': 123}

(2)键必须是可哈希的

大多数Python对象可以作为键,但它们必须是可哈希的对象。像列表和字典这样的可变类型,由于它们不是可哈希的,所以不能作为键。
       所有不可变的类型都是可哈希的,因此它们都可以做为字典的键。要说明的是:值相等的数字表示相同的键,即整型数字1和浮点数1.0的哈希值是相同的,它们是相同的键。
       同时,也有一些可变对象(很少)是可哈希的,它们可以做字典的键,但很少见。举一个例子,一个实现了__hash__() 特殊方法的类。因为__hash__()方法返回一个整数,所以仍然是用不可变的值(做字典的键)。
       为什么键必须是可哈希的?解释器调用哈希函数,根据字典中键的值来计算存储你的数据的位置。如果键是可变对象,它的值可改变。如果键发生变化,哈希函数会映射到不同的地址来存储数据。如果这样的情况发生,哈希函数就不可能可靠地存储或获取相关的数据。选择可哈希的键的原因就是因为它们的值不能改变。
        数字和字符串可以被用做字典的键,元组是不可变的但也可能不是一成不变的,因此用元组做有效的键必须要加限制:若元
组中只包括像数字和字符串这样的不可变参数,才可以作为字典中有效的键。

示例:
# vi userpw.py

#!/usr/bin/env python

db = {}

def newuser():

  prompt= 'please regist your name: '

  while True:

    name = raw_input(prompt)

    if db.has_key(name):

      prompt = 'name taken,try another: '

      continue

    else:

      break

  pwd = raw_input('passswd: ')

  db[name] = pwd

  print 'Newuser [%s] has added successfully!' %name

def olduser():

  name = raw_input('login: ')

  pwd = raw_input('passwd: ')

  passwd = db.get(name)

  if passwd == pwd:

    print 'welcome back',name

  else:

    print 'login incorrect!'

def showmenu():

  prompt = """

(N)ew User Login

(E)xisting User Login

(Q)uit

Enter choice: """

  while True:

    try:

      choice = raw_input(prompt).strip()[0].lower()

      print '\nYou picked: [%s]' % choice

      if choice not in 'neq':

        print 'invalid option,please try again'

      if choice == 'n':

        newuser()

      if choice == 'e':

        olduser()

      if choice == 'q':

        break

    except(EOFError,KeyboardInterrupt):

      print 'invalid option,please try again'

if __name__ == '__main__':

  showmenu()
(0)

相关推荐

  • 如何高效使用Python字典的方法详解

    前言 众所周知字典(dict)对象是 Python 最常用的数据结构,社区曾有人开玩笑地说:"Python企图用字典装载整个世界",字典在Python中的重要性不言而喻,这里整理了几个关于高效使用字典的清单,希望Python开发者可以在日常应用开发中合理利用,让代码更加 Pythonic. 1.用 in 关键字检查 key 是否存在 Python之禅中有一条开发哲学是: There should be one-- and preferably only one --obvious wa

  • python创建和使用字典实例详解

    字典是python中唯一内建的映射类型.字典中的值并没有特殊的顺序,但是都存储在一个特定的键(key)里.键可以是数字,字符串甚至是元组.1. 创建和使用字典字典可以通过下面的方式创建: 复制代码 代码如下: phonebook = {'Alice':'2341','Beth':'9102','Ceil':'3258'} 字典由多个键及与其对应的值构成的对组成.每个键和它的值之间用冒号(:)隔开,项之间用逗号(,)隔开,而整个字典是由一对大括号括起来.空字典:{} 1.1 dict函数可以用di

  • python字典多键值及重复键值的使用方法(详解)

    在Python中使用字典,格式如下: dict={ key1:value1 , key2;value2 ...} 在实际访问字典值时的使用格式如下: dict[key] 多键值 字典的多键值形式如下: dict={(ke11,key12):value ,(key21,key22):value ...} 在实际访问字典里的值时的具体形式如下所示(以第一个键为例): dict[key11,key12] 或者是: dict[(key11,key12)] 以下是实际例子: 多值 在一个键值对应多个值时,

  • 在Python中操作字典之setdefault()方法的使用

    setdefault()方法类似于get()方法,但会设置字典[键]=默认情况下,如果键不是已经在字典中. 方法 以下是setdefault()方法的语法: dict.setdefault(key, default=None) 参数 key -- 这是要被搜索的键 default -- 这是没有找到键的情况下返回的值. 返回值 此方法返回字典可用的键值,如果给定键不可用,则它会返回所提供的默认值. 例子 下面的例子显示了setdefault()方法的使用. #!/usr/bin/python d

  • 在Python中操作字典之fromkeys()方法的使用

    fromkeys()方法从序列键和值设置为value来创建一个新的字典. 语法 以下是fromkeys()方法的语法: dict.fromkeys(seq[, value])) 参数 seq -- 这是将用于字典的键准备的值的列表. value -- 这是可选的,如果提供的话则值将被设置为这个值 返回值 此方法返回列表. 例子 下面的例子显示fromkeys()方法的使用. #!/usr/bin/python seq = ('name', 'age', 'sex') dict = dict.fr

  • 在Python中操作字典之update()方法的使用

    update()方法添加键 - 值对到字典dict2.此函数不返回任何值. 语法 以下是update()方法的语法: dict.update(dict2) 参数 dict2 -- 这是被添加dict到的词典 返回值 此方法不返回任何值 例子 下面的例子显示了update()方法的使用 #!/usr/bin/python dict = {'Name': 'Zara', 'Age': 7} dict2 = {'Sex': 'female' } dict.update(dict2) print "Va

  • python使用点操作符访问字典(dict)数据的方法

    本文实例讲述了python使用点操作符访问字典(dict)数据的方法.分享给大家供大家参考.具体分析如下: 平时访问字典使用类似于:dict['name']的方式,如果能通过dict.name的方式访问会更方便,下面的代码自定义了一个类提供了这种方法. class DottableDict(dict): def __init__(self, *args, **kwargs): dict.__init__(self, *args, **kwargs) self.__dict__ = self de

  • Python中使用item()方法遍历字典的例子

    Python字典的遍历方法有好几种,其中一种是for...in,这个我就不说明,在Python了几乎随处都可见for...in.下面说的这种遍历方式是item()方法. item() item()方法把字典中每对key和value组成一个元组,并把这些元组放在列表中返回. DEMO 代码: 复制代码 代码如下: person={'name':'lizhong','age':'26','city':'BeiJing','blog':'www.jb51.net'}   for key,value i

  • Python中返回字典键的值的values()方法使用

    values()方法返回给定的字典中所有可用值的列表. 语法 以下是values()方法的语法: dict.values() 参数 NA 返回值 此方法返回在给定字典中的所有可用的值的列表. 例子 下面的例子显示values()方法的使用. #!/usr/bin/python dict = {'Name': 'Zara', 'Age': 7} print "Value : %s" % dict.values() 当我们运行上面的程序,它会产生以下结果: Value : [7, 'Zar

  • python基础入门详解(文件输入/输出 内建类型 字典操作使用方法)

    一.变量和表达式 复制代码 代码如下: >>> 1 + 1               2>>> print 'hello world' hello world>>> x = 1               >>> y = 2>>> x + y3 Python是强类型语言,无法根据上下文自动解析转换成合适的类型. Python是一种动态语言,在程序运行过程中,同一个变量名在运行的不同阶段可以代表不同形式的值(整型,浮

随机推荐