• Python 集合、字典、运算符


    先区分一下序列类型和散列类型:

    序列类型:list、string、tuple,他们中的元素是有序的。

    散列类型:set、dict,他们中的元素无序的。(注意:python3.7.0开始字典变成"有序"了)

    序列类型有序,可以用索引。而散列类型中的元素是无序的,所以不能索引。

    一、集合

    (一).集合的特性:无序、唯一、可变。集合中的元素需要可哈希的,元素不可以是可变对象。

    定义一个集合:

    (1).工厂方法:se = set()

    注意不要写成 se = () 这样变成元组了。

    (2).直接定义:se = {1,2,3} 用大括号括起来。

    大括号中要写入元素,不写元素就是一个空字典了。

    (3).案例分析:

    # 分析这两种定义,哪一个会报错?
    s1 = {1, ['a', 'b', 'c']} 
    s2 = {1, ('a', 'b', 'c')}

    第一种会报错。TypeError: unhashable type: 'list'

    因为集合中的元素要符合不可变这个规则, 列表可变,不符合规则,报错了。

    第二种,元组不可变,符合规则,所以解释器不会跟你叫劲。

    至于什么是可哈希?往下翻……

    (二).集合的运算

    (1).检查成员:in / not in

    语法:item in set_object -> bool

    例:

    not in 就是取反

    (2).交集:&

    两个集合共同有的元素,取两个集合重复的元素。

    例:

    # 1.有两个列表 x = [1,2,3,'a','b','c']  y = ['a','b','c'] 找出x,y列表中,共有元素
    
    x = [1, 2, 3, 'a', 'b', 'c']
    y = ['a', 'b', 'c']
    
    print(set(x) & set(y))
    """
    列表没有交集"&"的功能,但是集合有。
    那么先工厂一下,然后再交集。
    
    运行结果:
    {'c', 'b', 'a'}  # 集合无序,所以元素输出的顺序未必如自己预想的
    """
    View Code

    为什么运行结果的顺序是乱的?因为集合无序的!

    (3).并集:|(shift+回车上面那个)

    取出不重复的值。字面意思理解,并集,并在一起了(相当于变成一个集合了,集合的特性之一:元素唯一)。

    例:

    (4).差集:-

    剪掉两个集合中的重复部分。

    本人数学最烂,就这么死记硬背着,第二个集合后面的元素都会砍掉。

    (5).与非集:^(脱字符:shift+6)

    取两个集合各自独有的元素。

    (6).小技巧:如何去重元素?

    利用集合的特性之一:唯一性

    a = [1, 2, 2, 3, "a", "b", "c", "a", "b", "a", 3]
    # 工厂一下,set()
    print(set(a)) # {1, 2, 3, 'c', 'b', 'a'}

    (三).集合的常用方法

    (1).set.add() 添加单个元素

    (2).set.update(iterable) 批量更新,会去重。

     

    二、字典

    (一).字典的特性

    1.key唯一

    2.无序(散列类型,Python3.7.0之前)

    3.可变

    key是唯一的,需要的是不可变对象,且要符合变量命名规则。key重名的话,值会被后者所覆盖。

    注意版本之间的区别,在Python3.7.0之前:字典是无序的(散列类型);从Python3.7.0开始:字典不再是散列类型了,是按照键的插入顺序进行排列!

    4.可以嵌套到任意深度(仅受可用内存约束)

    (二).定义一个字典

    (1).直接大括号:di = {} 是一个空字典

    type(di)之后:<class 'dict'>

    注意要与集合的定义区别开来!定义空集合是:s1 = set()

    一般是直接把值写进去,语法:di = {key1:value,key2:value,...} 键值对是冒号的形式

    例:

    (2).工厂方式:di = dict(key1=value,key2=value,...) 键值对用等号"="等起来,工厂方式的key不要加引号

    例:

    (3).案例分析:

    # 分析这两种定义,哪一个会报错?
    di1 = {'a': 'test', ('a', 'b'): 'test'}
    di2 = {'a': 'test', {'a', 'b'}: 'test'}

    di2会报错,TypeError: unhashable type: 'set'

    key需要是不可变对象。第二种里有一个集合,集合的特性之一是可变,不符合key的规则,解释器跟你急了。

    而第一种里是一个元组,元组不可变,没问题了。

    另外,内建函数也可以作为字典的key:

    d1 = {len: 1, str: "aaa"}
    
    print(d1[len])  # 1
    print(d1[str])  # 'aaa'
    View Code

    (三).往字典里插入值

    di = {}
    
    # 直接赋值一样
    di["name"] = "quanquan616"
    
    """
    get(key) 如果key不存在,不会报错。取到了会返回原有值。
    get(key,value) 当key不存在的时候,会返回value的值,常用来提示。
    """
    di.get("sex", "没有这个键")
    """
    如果要插入值,可以这么做:
    di["name"] = di.get("name","")+"zyb"
    di["sex"] = di.get("sex","male")
    di["age"] = di.get("age",0)+30
    di -> {'name': 'zyb', 'sex': 'male', 'age': 30}
    """
    
    """
    setdefault(key,value) 字面理解,设置默认。
    key有的话会返回原有值,无此key才会设置。
    如果此key已有,不会改变原有值,不会被更新
    """
    di.setdefault("name", "zyb")
    
    """
    update(dict_object) 参数需要是一个字典对象。
    有就改变,没有就添加进去。
    """
    di.update({"age": 35, "read": 15})
    
    # fromkeys(iterable,value) 批量设置,所有的值都是一样的。不会改变原有字典
    di.fromkeys("abc", 30)
    
    print(di)
    # {'name': 'quanquan616', 'age': 35, 'read': 15}
    View Code

    (四).对字典进行取值

    # 直接用键进行取值,Dict[key]
    print(di["name"])  # quanquan616
    
    # get(key) 取到了就返回值,没有取到不会报错
    print(di.get("name"))  # quanquan616
    
    # get()的另一种用法
    di = {}
    di["name"] = di.get("name", "") + "zyb"
    print(di)  # {'name': 'zyb'}
    
    # setdefault(key) 有就返回这个键的值。如果没有这个键,会创建,不指定值的话,会是None。不会因为指定了值而改变原有数据。
    print(di.setdefault("name"))  # quanquan616
    
    # values() 取出所有的值,返回一个迭代器
    print(di.values())  # dict_values(['quanquan616', 35, 15])
    View Code

    (五).changed in python3.7.0

    官方文档对python3.7.0中字典的描述:

    Dictionary order is guaranteed to be insertion order.Dictionaries preserve insertion order.

    Note that updating a key does not affect the order.Keys added after deletion are inserted at the end.

    大意:字典保留的顺序是键插入的顺序,更新值不会影响原有的顺序,但删除后添加的键将在末尾插入。

    演示如下:

    (六).字典小技巧(以下代码均在python3.7.0中运行)

    (1).对字典中的元素进行排序

    di = {"in": 123, "to": 511, "she": 255, "i": 111}
    
    print(sorted(di.items(), key=lambda item: item[1], reverse=True))
    # 运行结果:[('to', 511), ('she', 255), ('in', 123), ('i', 111)]
    
    """
    di.items() 将字典转化为可迭代对象。Dict.items()将字典中的key-value元素,转化为了元组
    # [('in', 123), ('to', 511), ('she', 255), ('i', 111)]
    
    key=lambda item: item[1] 取元素中的第二个元素作为比较的参数
    """

    key是用来指定做排序的每项元素的那个部分。匿名函数的item,就是指代每项元素,item[1]就是元素的第二项的意思。

    注意此方法中,value的值只能是数值,如果出现字符串就会报错。(字符串和数值能直接做比较吗?)

    (2).对列表中的多个字典排序

    # 按age从大到小排序
    alist = [{"name": "a", "age": 20}, {"name": "b", "age": 30}, {"name": "c", "age": 25}]
    alist.sort(key=lambda item: -item.get("age"))
    """
    key中的lambda表达,等价于下面这种方式。
    获得字典中"age"的值,key的意思是以哪个函数为关键字。
    """
    
    # def get_sort(li):
    #     return li.get("age")
    # alist.sort(key=get_sort, reverse=True)
    
    print(alist)
    # [{'name': 'b', 'age': 30}, {'name': 'c', 'age': 25}, {'name': 'a', 'age': 20}]
    View Code

    (3).合并字典(键相同则覆盖)

    x = {"a": 1, "b": 2}
    y = {"b": 3, "c": 3, "d": 4}
    
    z = {**x, **y}
    print(z)
    # {'a': 1, 'b': 3, 'c': 3, 'd': 4}
    View Code

    (4).字典代替多个if...elif

    如下这段if...elif...else语句:

    def fun(x):
        if x == "a":
            return 1
        elif x == "b":
            return 2
        else:
            return None
    View Code

    可以写成更加简洁更加pythonic的代码:

    def fun(x):
        return {"a": 1, "b": 2}.get(x)

    dict.get() 如果get不到值会返回None

    (5).dict.pop()方法从字典中删除条目。但是,传递给pop()中的参数,必须是字典中存在的键,而不是值。

    三、运算符(部分简单的运算符之前已有摘录,不在这里重复了,遇到实际情况不会了直接google it)

    (一).身份运算符:is / is not

    两个对象,是否指向同一个id。(id和内存地址还是有区别的)

    注意区分"=="和"is":

    ==用来判断两个值是否相等,is是判断两个对象的id是否相同。

    (二).逻辑运算符 not > and > or

    四、哈希

    hash(object)生成一个唯一的哈希值。

    小技巧:这个内置函数,可以来判断一个对象是否是可变的。能生成哈希值的就是不可变对象。

  • 相关阅读:
    最短路
    P2863 [USACO06JAN]牛的舞会The Cow Prom
    牛客小白月赛12
    牛客练习赛41
    求余
    dreamstart 的催促
    deepin安装tesseract出错,tesserocr.cpp:653:10: fatal error: leptonica/allheaders.h: 没有那个文件或目录
    自动抽屉 + 点赞 + 取消赞
    爬取汽车之家
    css垂直居中和水平居中
  • 原文地址:https://www.cnblogs.com/quanquan616/p/8284461.html
Copyright © 2020-2023  润新知