zoukankan      html  css  js  c++  java
  • Python学习笔记3:元组和集合

    Python学习笔记3:元组和集合

    元组

    存在意义

    元组的定义为不可变更的有序对象集合,和列表只有一个区别:不可改变。也就是说元组声明后是不能改变其内容的。

    这有意义吗?列表不是已经很好用了嘛。不,这真的很有意义。

    我们回想以下Java或者PHP,在实际使用中是不是会声明大量的const值,比如错误代码,或者描述性文字之类的直接写入代码的硬编码部分。这些内容都是一旦声明你就不希望其它程序有意或者无意地去改写。

    但这些在Python中是无法实现的,因为Python并不支持const,而元组就是一种代替品。

    《Head first Python》一书指出元组的性能是远优于列表的,Python解释器在这方面有针对性优化。当然这点是很容易理解的,毕竟对于一个兼顾数组和链表,功能相对复杂的容器,一个不可变的简单数据结构自然在某些性能上会胜过。但这里还是有很多东西可以细细琢磨,比如空间复杂度列表显而易见的要高出,但在读取方面,元组的时间复杂度是真的能优于列表?它是怎么做到的?

    创建

    直接声明

    要直接声明一个元组可以这样:

    a = ("a","b","c")
    print(a)
    

    输出

    ('a', 'b', 'c')

    这很容易,和列表的唯一区别就是把中括号换成了小括号。

    但有一种特例需要特别说明,如果你要声明的元组中只包含一个元素,那你不能写成('a'),而是要写成('a',),原因也很明显,对于前者,Python解释器会认为()是优先级运算符,而非元组声明,只有加入一个逗号才能确实指明这里是元组声明。

    类型转换

    类型转换也很好理解,既然元组就是不能改变的列表,那当然可以直接由列表转换成元组,当然字符串什么的也是可以的:

    a = tuple(["a","b","c"])
    print(a)
    

    输出

    ('a', 'b', 'c')

    集合

    集合的定义是无序且具有唯一性的对象容器。这里集合这个概念其实就是中学数学里的集合,两者完全一致。它具有两个特性:

    • 无序:这点和字典一样。
    • 唯一性:集合的元素在集合中都是唯一的,不能重复。

    创建

    直接声明

    a = {"a","b","c"}
    print(a)
    

    输出

    {'a', 'b', 'c'}

    集合的声明很简单,同字典类似,使用大括号,区别就是集合中没有键值对。

    类型转换

    和其它常用容器一样,集合也可以通过类型钻换创建:

    a = set("aabbccddee")
    print(a)
    

    输出

    {'a', 'c', 'd', 'e', 'b'}

    可以看到转换前的字符串是有重复字符的,但集合的特性决定了转换后必然是去重的。

    集合运算

    前面说过了,集合是一个数学上的概念,自然也支持数学上的集合运算,即交集,并集和补集。

    a = set("abcde")
    b = set("be12345gw")
    c = a.intersection(b)
    print(a)
    print(b)
    print(c)
    

    输出

    {'b', 'a', 'e', 'c', 'd'}
    {'2', '3', 'b', '4', 'w', '5', 'e', '1', 'g'}
    {'b', 'e'}

    可以看出,交集就是求两个集合重复的元素集。

    a = set("abcde")
    b = set("be12345gw")
    c = a.union(b)
    print(a)
    print(b)
    print(c)
    

    输出

    {'b', 'c', 'e', 'a', 'd'}
    {'5', '3', 'b', 'g', '1', '4', '2', 'e', 'w'}
    {'w', '5', '3', 'b', 'g', 'c', '1', '4', '2', 'e', 'a', 'd'}

    并集也很好理解,就是两个集合的所有元素加起来,再去重。

    补集也有叫差集,定义为b在a中的补集即a中的元素减去a和b的交集。对应的代码示例如下:

    a = set("abcde")
    b = set("be12345gw")
    c = a.difference(b)
    print(a)
    print(b)
    print(c)
    

    输出

    {'b', 'c', 'd', 'a', 'e'}
    {'4', '2', 'e', '1', '5', '3', 'w', 'b', 'g'}
    {'a', 'd', 'c'}

    如果要求a在b中的补集那就是反过来b.difference(a)

    如果想和我一样复习一下集合的数学概念的,可以阅读百度百科

    存在意义

    集合在某些情况下极为有用,比如要对比两个字符串,求它们中重复的字符,在这种情况下将其转换为两个集合再求交集即可。

    这里不再一一举例,对于各种容器,只有经常思考,使用中对比其各自优缺点,才能真正运用自如。

    增删改查

    对集合的增删改查相对简单,这里简单介绍一下:

    a = set("abcde")
    #追加元素
    a.add("f")
    print(a)
    #删除元素
    a.remove("a")
    print(a)
    

    输出

    {'f', 'b', 'e', 'c', 'a', 'd'}
    {'f', 'b', 'e', 'c', 'd'}

    本篇文章首发自魔芋红茶的博客https://www.cnblogs.com/Moon-Face/ 请尊重其他人的劳动成功,转载请注明。
  • 相关阅读:
    ZOJ 3327 Friend Number
    ZOJ 3324 Machine
    2010-2011 ACM-ICPC, NEERC, Southern Subregional Contest C Explode 'Em All
    UVA 12594 Naming Babies
    POJ 3709 K-Anonymous Sequence
    POJ 1180 Batch Scheduling
    POJ 1160 Post Office
    HDU 3516 Tree Construction
    HDU 3045 Picnic Cows
    UVALive 5097 Cross the Wall
  • 原文地址:https://www.cnblogs.com/Moon-Face/p/14518003.html
Copyright © 2011-2022 走看看