Python成为专业人士笔记--Dictionary 字典

专业人士笔记”系列目录:

创帆云:Python成为专业人士笔记--强烈建议收藏!每日持续更新!

Dictionary字典介绍

字典是键值存储的一个例子,在Python中也称为映射。它允许您通过引用键来存储和检索元素。由于字典是按键引用的,所以查找速度非常快。由于它们主要用于按键去索引所有的值,所以不进行排序

创建一个字典

字典可以以多种方式初始化:

         d = {}
 #建一个空的字典

 d = {'key': 'value'}
 #新建一个字典并初始化值
 #直接从另外一个字典copy过来并初始化是可行的,语法:
 d = {**otherdict}

 #也可以同时利用几个字典组合组成新的字典
 d = {**otherdict, **yetanotherdict}
      

修改字典

要将项添加到字典中,只需创建一个带有值的新键即可:

         d['newkey'] = 42
      

也可以将list和dictionary作为值添加

        d['new_list'] = [1, 2, 3]
d['new_dict'] = {'nested_dict': 1}
      

要删除项,可以用del关键字从字典中删除键 :

del d[‘newkey’]

避免KeyError异常

使用字典时一个常见的陷阱是访问一个不存在的键。这通常会导致一个KeyError异常

         mydict = {} #这是一个空字典
 mydict['not there']

 Traceback (most recent call last):
  File "", line 1, in 
 KeyError: 'not there'
      

避免键错误的一种方法是使用dict.get方法,该方法允许您指定一个默认值,以便在没有这个键的情况下返回。

        value = mydict.get(key, default_value)
      

如果存在所需要获取的key,则返回mydict[key]的值,否则返回默认值。注意,这并没有向mydict添加密钥。如果你想存储键值对,你应该使用mydict.setdefault(键,默认值),它存储键值对。

         mydict = {}
 print(mydict)
 #{}
 print(mydict.get("foo", "bar"))
 #bar  注意,这里返回了默认值
 print(mydict)
 #{}  仍然是空字典
 print(mydict.setdefault("foo", "bar"))
 #bar
 print(mydict)
 #使用setdefault方法存储了键值对 {'foo': 'bar'}
      

处理此问题的另一种方法是捕获异常 :

         try:
    value = mydict[key]
 except KeyError:
    value = default_value
      

还可以提前检查键是否在字典中 :

        if key in mydict:
   value = mydict[key]
else:
   value = default_value
      

但是,请注意,在多线程环境中,在您进行检查时,可能会有其它线程从字典中删除键,从而创建一个仍然可以抛出异常的程序。另一种选择是使用dict的子类collections.defaultdict(下文会讲解),它会在给定新键时在dict中创建新条目。

迭代字典

如果您使用字典迭代器(例如在for语句中),它将遍历字典的键。例如

         d = {'a': 1, 'b': 2, 'c':3}
 for key in d:
     print(key, d[key])

# c 3
# b 2
# a 1
      

当用于行表达式时也是如此:

        print([key for key in d])
# ['c', 'b', 'a'] 
      

items()方法可用于同时循环键和值

        for key, value in d.items():
    print(key, value)
# c 3
# b 2
# a 1
      

而values()方法可以像预期的那样,只对值进行迭代

        for key, value in d.values():
    print(key, value)
 #3
 #2
 #1
      

有默认值的字典

标准库中可用 : defaultdict

        from collections import defaultdict

 d = defaultdict(int)
 d['key']
 # 默认是 0

 d['key'] = 5

 d['key']
 #输出:5

 d = defaultdict(lambda: 'empty')
 d['key']
 #输出:'empty'

 d['key'] = 'full'
 d['key']
 #默认值被覆盖 输出'full'
      

另外,如果您必须使用内置的dict类,那么使用dict.setdefault()将允许您在访问以前不存在的键时创建一个默认值

               d = {}
       print(d)
       #输出 {}

       d.setdefault('Another_key', []).append("This worked!")
       print(d)
       #输出:{'Another_key': ['This worked!']}         
      

请记住,如果您要添加许多值,dict.setdefault()将在每次调用初值时创建一个新实例,这可能会创建不必要的工作负载

合并字典

考虑下面的字典:

        fish = {'name': "Nemo", 'hands': "fins", 'special': "gills"}
dog = {'name': "Clifford", 'hands': "paws", 'color': "red"} 
        
      

赋值:

        fishdog = {**fish, **dog}
print(fishdog)

#输出:
{'hands': 'paws', 'color': 'red', 'name': 'Clifford', 'special': 'gills'}
      

正如这个例子所演示的,复制的键后面的会覆盖前的值(例如“Clifford”覆盖“Nemo”)

同样的写法还有如下:

        fish.update(dog)
print(fish)
#输出:{'color': 'red', 'hands': 'paws', 'name': 'Clifford', 'special': 'gills'}
      

访问键和值

在使用字典时,通常需要访问字典中的所有键和值

给定一个字典:

        mydict = {
 'a': '1',
 'b': '2'
}

      

可以使用keys()方法获得key列表

         print(mydict.keys())
 # Python2: ['a', 'b']
 # Python3: dict_keys(['b', 'a'])
      

如果想要一个值列表,那么使用values()方法

         print(mydict.values())
 # Python2: ['1', '2']
 # Python3: dict_values(['2', '1'])
      

如果希望同时使用键和键对应的值,可以使用items()方法 :

         print(mydict.items())
 # Python2: [('a', '1'), ('b', '2')]
 # Python3: dict_items([('b', '2'), ('a', '1')])
      

注意:因为dict是未排序的,所以键、值没有排序顺序。如果您关心这些方法返回的顺序,可以使用sort()、ordered()或OrderedDict。

访问字典的值

        dictionary = {"Hello": 1234, "World": 5678}

print(dictionary["Hello"])  #输出:1234
      

本例中的字符串“Hello”被称为键。它用于通过将键放在方括号中来查找dict中的值。

在dict定义中,数字1234出现在相应的冒号之后。在这个dict中,它被称为“Hello”映射到的值。

创建有顺序的字典

默认字典是无序的,当然你可以创建一个有序的字典,它在遍历字典中的键时遵循一个确定的顺序。使用来自collections模块的OrderedDict。当迭代遍历时,总是以原始插入顺序返回dictionary元素。

        from collections import OrderedDict

 d = OrderedDict()
 d['first'] = 1
 d['second'] = 2
 d['third'] = 3
 d['last'] = 4
 
 for key in d:
     print(key, d[key])  

 #输出 "first 1", "second 2", "third 3", "last 4" 
      

使用“ ** ” 操作字典

可以使用**关键字操作符将字典中的键-值对传递到函数的参数中。官方文档中的一个简化示例 :

             def parrot(voltage, state, action):
       … print("This parrot wouldn't", action, end=' ')
       … print("if you put", voltage, "volts through it.", end=' ')
       … print("E's", state, "!")
       …
       d = {"voltage": "four million", "state": "bleedin' demised", "action": "VOOM"}
       parrot(**d)         
      

该操作符即可以合并字典,见前面的“合并字典”章节

带着逗号的小尾巴

与列表和元组一样,您可以在字典中包含一个尾随逗号 ,其并不会影响字典的值

        role = {"By day": "A typical programmer",

        "By night": "Still a typical programmer", }

print(role)

#输出:{'By day': 'A typical programmer', 'By night': 'Still a typical programmer'}

和之前的值一样,其中的逗号其实是个逗比、打酱油的,不影响值
      

dict() 构造函数

dict()构造函数可用于从关键字参数创建字典,或从键-值对的单个迭代器创建字典,或从单个字典和关键字参数创建字典:

         dict(a=1, b=2, c=3)
 # {'a': 1, 'b': 2, 'c': 3}

 dict([('d', 4), ('e', 5), ('f', 6)])
 # {'d': 4, 'e': 5, 'f': 6}

 dict([('a', 1)], b=2, c=3)
 # {'a': 1, 'b': 2, 'c': 3}

 dict({'a' : 1, 'b' : 2}, c=3)
 # {'a': 1, 'b': 2, 'c': 3}
      

字典值的所有组合值

         options = {
 "x": ["a", "b"],
 "y": [10, 20, 30]
 }

      

给定一个类似于上面所示的字典,其中有一个列表,它表示一组值,以便查找对应的键。假设您希望探索“x”=“a”和“y”=10,然后“x”=“a”和“y”=20,以此类推,直到您探索了所有可能的组合。

您可以使用以下代码创建一个返回所有这些值组合的列表。

         import itertools

 options = {
 "x": ["a", "b"],
 "y": [10, 20, 30]}

 keys = options.keys()
 values = (options[key] for key in keys)
 combinations = [dict(zip(keys, combination)) for combination in  itertools.product(*values)]
 print combinations

#输出:
[{'x': 'a', 'y': 10},
 {'x': 'b', 'y': 10},
 {'x': 'a', 'y': 20},
 {'x': 'b', 'y': 20},
 {'x': 'a', 'y': 30},
 {'x': 'b', 'y': 30}]


      

补充:ZIP函数

zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的对象,这样做的好处是节约了不少的内存。

我们可以使用 list() 转换来输出列表。

如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同,利用 * 号操作符,可以将元组解压为列表。


好了,今天的分享就到这里,禁止转载,违者必究

猜你喜欢

转载自blog.csdn.net/oSuiYing12/article/details/106211762