zoukankan      html  css  js  c++  java
  • Python:字典

    blog:https://www.cnblogs.com/Rohn

    Tips:本文中代码均使用3.8.x版本的Python。

    部分文字来自网络,侵删。

    字典

    像列表一样,字典是许多值的集合。但不像列表的下标,字典的索引可以使用许多不同数据类型,不只是整数。字典的索引被称为“键”,键及其关联的值称为键-值对。

    语法格式

    dictname = {'key':'value1', 'key2':'value2', ..., 'keyn':valuen}
    

    例如

    myCat = {'size': 'fat', 'color': 'gray', 'disposition': 'loud'}
    

    将一个字典赋给myCat变量。这个字典的键是'size''color''disposition'。这些键相应的值是'fat''gray''loud'。可以通过它们的键访问这些值:

    >>> myCat['size']
    'fat'
    

    字典仍然可以用整数值作为键, 就像列表使用整数值作为下标一样, 但它们不必从0开始,可以是任何数字。

    a = {12: 'fish', 523: 'lion'}
    

    字典与列表的区别

    不像列表,字典中的表项是不排序的。但字典中没有“第一个”表项。虽然确定两个列表是否相同时,表项的顺序很重要,但在字典中,键-值对输入的顺序并不重要。

    >>> a = ['dog','fish','cat']
    >>> b = ['fish','dog','cat']
    >>> a == b
    False
    >>> a={3:'dog',23:'cat',53:'fish'}
    >>> b={23:'cat',3:'dog',53:'fish'}
    >>> a == b
    True
    

    因为字典是不排序的,所以不能像列表那样切片。尝试访问字典中不存在的键,将导致KeyError出错信息。这很像列表的“越界”IndexError出错信息。

    >>> myCat = {'size': 'fat', 'color': 'gray', 'disposition': 'loud'}
    >>> myCat['age']
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    KeyError: 'age'
    

    字典的方法

    字典的键、值和键-值对

    字典的键、值和键-值对:keys()values()items()
    利用keys()values()items()方法,循环分别可以迭代键、值或键-值对。请注意,items()方法返回的dict_items值中,包含的是键和值的元组。

    >>> myCat = {'size': 'fat', 'color': 'gray', 'disposition': 'loud'}
    >>> for i in myCat.values():
    ...  print(i)
    ...
    fat
    gray
    loud
    
    >>> for i in myCat.keys():
    ...  print(i)
    ...
    size
    color
    disposition
    
    >>> for i in myCat.items():
    ...  print(i)
    ...
    ('size', 'fat')
    ('color', 'gray')
    ('disposition', 'loud')
    

    通过innot in检查某个键或值是否存在于字典中。

    >>> 'name' in myCat.keys()
    False
    >>> 'size' in myCat.keys()
    True
    >>> 'gray' in myCat.values()
    True
    >>> 'gray' not in myCat.values()
    False
    

    get()方法

    字典有一个get()方法,它有两个参数:要取得其值的键,以及如果该键不存在时,返回的备用值。

    a = {'cat': 2,'dog': 5,'fish': 10}
    >>> 'I have ' + str(a.get('fish', 0)) + ' fish.'
    'I have 10 fish.'
    >>> 'I have ' + str(a.get('bird', 0)) + ' birds.'
    'I have 0 birds.'
    

    setdefault()方法

    setdefault()方法提供了一种方式,在一行中完成这件事。传递给该方法的第一个参数,是要检查的键。第二个参数,是如果该键不存在时要设置的值。如果该键确实存在,方法就会返回键的值。

     a = {'cat': 2,'dog': 5,'fish': 10}
    >>> a.setdefault('bird',3)
    3
    >>> a
    {'cat': 2, 'dog': 5, 'fish': 10, 'bird': 3}
    >>> a.setdefault('bird',6)
    3
    >>> a
    {'cat': 2, 'dog': 5, 'fish': 10, 'bird': 3}
    

    常见问题解决方案

    字典中的键映射多个值

    问题

    怎样实现一个键对应多个值的字典?

    解决方案

    如果你想要一个键映射多个值,那么你就需要将这多个值放到另外的容器中, 比如列表或者集合里面。例如:

    d = {
        'a' : [1, 2, 3],
        'b' : [4, 5]
    }
    e = {
        'a' : {1, 2, 3},
        'b' : {4, 5}
    }
    

    选择使用列表还是集合取决于你的实际需求。如果你想保持元素的插入顺序就应该使用列表, 如果想去掉重复元素就使用集合(并且不关心元素的顺序问题)。

    字典的运算

    问题

    怎样在数据字典中执行一些计算操作,比如求最小值、最大值?

    以下是蔬菜价格的数据字典:

    vegetables = {
        'tomato': 3.50,
        'potato': 2.32,
        'cucumber': 1.75,
        'eggplant': 5.15,
        'pepper': 8.99
    }
    

    找出价格最便宜的蔬菜和最贵的蔬菜。

    解决方案

    如果你在一个字典上执行普通的数学运算,你会发现它们仅仅作用于键,而不是值。比如:

    print(min(vegetables)) # Returns 'cucumber'
    print(max(vegetables)) # Returns 'tomato'
    

    使用字典的 values() 方法来解决这个问题:

    a = min(vegetables.values())
    b = max(vegetables.values())
    print(f'The lowest price for vegetables is {a}.')
    print(f'The highest price for vegetables is {b}.')
    

    输出结果为:

    The lowest price for vegetables is 1.75.
    The highest price for vegetables is 8.99.
    

    但不是最终需要得到的结果,最终需要知道最低和最高价格的蔬菜。

    zip() 函数方案通过将字典”反转”为 (值,键) 元组序列来解决了上述问题。

    a = min(zip(vegetables.values(),vegetables.keys()))
    b = max(zip(vegetables.values(),vegetables.keys()))
    print(f'The lowest price for vegetables is {a}')
    print(f'The highest price for vegetables is {b}')
    

    输出结果为:

    The lowest price for vegetables is (1.75, 'cucumber')
    The highest price for vegetables is (8.99, 'pepper')
    
  • 相关阅读:
    Oracle:SQL语句--对表的操作——修改列的数据类型( 即 修改字段的数据类型)
    Oracle:SQL语句--对表的操作——修改列的数据类型( 即 修改字段的数据类型)
    有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和
    有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和
    鸡兔同笼:笼子里一共有鸡和兔子35只,一共有94条退, 笼子里一共有鸡和兔子共多少只
    jQuery,使用on代替delegate,live 写法区别
    安卓手机微信页面position: fixed位置错误
    表单提交是ajax提交,PC提交没问题但是手机提交就会一直跳到error,并且也没状态码一直是0
    新版本的jquery checkbox 全选反选代码只能执行一遍,第二次就失败attr与prop区别
    倒计时js代码
  • 原文地址:https://www.cnblogs.com/Rohn/p/13170326.html
Copyright © 2011-2022 走看看