Loading

数据结构 - 字典和集合

一、 字典

    - 以键值对存储的数据形式
    - 字典原理: 将key关键字作为自变量,通过哈希函数计算出一个整数值,即为该元素的存储地址
    - 牺牲空间来节省时间
    - 如果地址出现冲突,链接发 / 开放寻址式(Python)

1. 字典的创建

    (1) 罗列法

        字典名 = {键:值}

    (2) dict 关键字

        字典名 = dict(key = value)

        # 此处key是字符串,不需要加引号,只代表关键字

       # 只适用于key为字符串的字典创建

    (3)dict+ zip

       字典名 = dict(zip(iteral1, iteral2))

    (4) .fromkeys

       字典名.fromkeys(iteral, [default = None])

      # 返回新创建的字典,字典名来自iteral, 字典值同一为default


# 方法一:
>>> a = {1:2, 2:3, 4:23}

# 方法二:
>>> a = dict(age = 12, 性别 = '男')
>>> a
{'age': 12, '性别': '男'}

# 方法三:
>>> m = range(1, 5)
>>> n = ('a', '@', 3)
>>> dict(zip(m,n))
{1: 'a', 2: '@', 3: 3}
>>> dict(zip(n, m))
{'a': 1, 3: 3, '@': 2}

# 方法四:
>>> a = {'a': 1, 3: 3, '@': 2}
>>> a.fromkeys(a, [23,'ed'])
{'a': [23, 'ed'], 3: [23, 'ed'], '@': [23, 'ed']}
>>> a.fromkeys(a.values(), [23,'ed'])
{1: [23, 'ed'], 2: [23, 'ed'], 3: [23, 'ed']}

2. 字典的特点

     (1) 键值对是无序的,因此无法通过索引访问;
     (2) key值不能重复,重复则update;
     (3) key必须是不可变类型

3. 字典的修改

       字典名[字典键值] = 字典值
               --- 如果有,更新;没有,添加

# 方法一:
>>> a = {1:2, 2:3 4:23}
>>> a['sa'] = 234
>>> a
{1: 2, 2: 3, 'sa': 234, 4: 23}

# 方法二(支持添加和查找,不支持修改):
>>> a = {1:2, 2:3 4:23}

# 没有key,则添加键值对
>>> a.setdefault(34, 's')
's'
>>> a
{1: 2, 2: 3, 4: 23, 34: 's'}

# 如果已有key,不修改value
>>> a.setdefault(2, 's')
3
>>> a
{1: 2, 2: 3, 4: 23, 34: 's'}

# 方法三:
# 有则改,无则添
>>> a = {1: 2, 3: 3, 34: 's'}
>>> b = {'a': 1, 3: 3, 34: '@'}
>>> a.update(b)
>>> a
{1: 2, 34: '@', 3: 3, 'a': 1}

4. 字典的运算

     不支持   +   *  >
     支持  ==  in, is

5. 字典的相关方法

(1) 添加相关

    ① .fromkeys(seq) 
        创建同值不同键的字典
        
    ② setdefault(key, value)
        - 用于给字典追加键值对,如果没有value,
        追加key-None键值对
        key不存在,追加key-value;
         已经存在,不可变value;

    ③ update((key, default=None)
        - 追加字典,对已有key更新,没有追加键值对,适用于多个   

 

(2) 删除相关

    ① pop(key)
        - 删除指定键值对,返回key对应value
    ② popitem()
        - 随机删除键值对,返回被删除的键值对
    ③ clear
        清空字典


(3) 获取相关

   get(key, '错误信息')
        - 返回value, 如果key不存在,返回指定信息


(4) 复制相关copy

   - 所有对象的拷贝都是浅拷贝

6. 字典的遍历

  返回迭代器

   (1) .keys()
   (2) .values()
   (3) .items()        

7. 字典生成式

   {f(x,y) for k,v in iterator}

	eg.
	# 冒号生成字典
	>>> {k:v for k,v in zip([1,2,3,4,5],[3,4,2,1,4])}
	{1: 3, 2: 4, 3: 2, 4: 1, 5: 4}
	# 不加冒号生成集合
	>>> {(k,v) for k,v in zip([1,2,3,4,5],[3,4,2,1,4])}
	{(5, 4), (3, 2), (1, 3), (4, 1), (2, 4)}
	>>> {k+v for k,v in zip([1,2,3,4,5],[3,4,2,1,4])}
	{9, 4, 5, 6}

二、  集合

       - value为None的字典

1. 集合的创建

    (1)    集合名 = {元素名1, 元素名2, ...}
    (2)    集合名 = set(iterator)
    #  空集合创建
    集合名 = {}          --- 空字典
    集合名 = set()     --- 空集合

2. 集合的特点

    (1) 集合元素不重复
    (2) 无序
    (3) 元素为不可变类型

3. 集合的运算

    (1) 无 * + 
        有 in is == >(父子集判断)
    (2) 差集(-),并集(|),交集(&),相对差集(^)
        s1 = {'a', 'b', 'c', 'd'}
        s2 = {'a', 'd', 'c', 'f', 'g'}
        ① 差集 --- 在被减数集合但是不在减数集合
            >>> s1 - s2
            {'b'}
            >>> s2 - s1
            {'f', 'g'}
        ②并集    --- 合并去重复
            >>> s1 | s2
            {'b', 'c', 'd', 'f', 'g', 'a'}
        ③交集 --- 同时出现
            >>> s1 & s2
            {'d', 'a', 'c'}
        ④相对差集 --- 不同时出现
            >>> s1 ^ s2
            {'b', 'f', 'g'}
    (3) 父子集判断( < 、 >)
            - 是否存在包含关系

4. 集合的相关方法

    (1) 添加类

        .add(element)

    (2) 删除类 


        ① .remove(element)
            有则原地删除,无则报错
        ② .discard(element)
            若有则删除,不存在不报错
        ③ .pop()
            随机删除一个元素,并返回

    (3) 复制类型


        .copy()
        浅拷贝,对象不是原来的对象,和元组类型不一样


    (4) 差集(-),并集(|),交集(&),相对差集(^)


        s1 = {'a', 'b', 'c', 'd'}
        s2 = {'a', 'd', 'c', 'f', 'g'}
        ① 差集 - difference
            >>> s1.difference(s2)
            {'b'}
            # 带有'_update'代表原地修改
            >>> s1.difference_update(s2)
            >>> s1
            {'b'}
        ②    交集 - intersection
            >>> s1.intersection(s2)
            {'d', 'a', 'c'}
        
        ③    并集 - union
            >>> s1.union(s2)
            {'b', 'c', 'd', 'f', 'g', 'a'}
            >>> s1.update()
            >>> s1
            {'d', 'a', 'b', 'c'}
        ④    相对差集 - symmetric_difference
            >>> s1.symmetric_difference(s2)
            {'b', 'f', 'g'}    
        ⑤    .isdisjoint()
            - 判断交集是否为空    
        ⑥     .issubset()
            - 判断是否子集        
        ⑦    .issupperset()
            - 判断是否父集

5. 集合的遍历

      只能通过遍历获得元素,不支持索引

三、  容器类型数据类型转化(list, tuple, dict, set)


       > 其他转字典,使用dict关键字方法, dict(a =1, b =2, c=3)
      > 字符串、列表、元组转集合,会去除重合元素
          如果含有可变类型,则不能朱哪壶·转化为集合

    

    

posted @ 2018-07-18 12:25  Geoffrey_one  阅读(498)  评论(0编辑  收藏  举报
/*
*/