zoukankan      html  css  js  c++  java
  • Python基本数据类型——元组和集合

    元组 tuple

    tuple和list非常类似,但是tuple一旦初始化就不能修改。元组采用圆括号表示。

    例如:

    >>> tuple = (1,2,3)
    >>> tuple
    (1, 2, 3)
    

    tuple被定义下来后就不可被改变了,也没有append(),insert()这样的方法。其他获取元素的方法和list是一样的,可以正常地使用tuple[0]、tuple[-1]进行访问,但不能赋值成另外的元素。程序通常不遍历元组,而是只访问完成当前任务所需的元组的一部分。

    不可变的tuple有什么意义?因为tuple不可变,所以代码更安全。如果可能,能用tuple代替list就尽量用tuple。

    tuple的陷阱:当你定义一个tuple时,在定义的时候,tuple的元素就必须被确定下来。

    字典中的键必须是唯一的同时不可变的,值则没有限制。

    如果只是定义一个元素的tuple,那么这个元素需要在后面跟上一个逗号:

    >>> t = (1,)
    >>> t
    (1,)
    

    定义的不是tuple,是1这个数!这是因为括号()既可以表示tuple,又可以表示数学公式中的小括号,这就产生了歧义,因此,Python规定,这种情况下,按小括号进行计算,计算结果自然是1。所以,只有1个元素的tuple定义时必须加一个逗号,,来消除歧义。

    zip函数构造元组:

    >>> zip([1,2,3],[4,5,6])
    [(1, 4), (2, 5), (3, 6)]
    >>> zip([1,2,3],[4,5,6],["x","y","z","d"])
    [(1, 4, 'x'), (2, 5, 'y'), (3, 6, 'z')]
    

    一个“可变的”tuple:

    >>> t = ('a', 'b', ['A', 'B'])
    >>> t[2][0] = 'X'
    >>> t[2][1] = 'Y'
    >>> t
    ('a', 'b', ['X', 'Y'])
    

    表面上看,tuple的元素确实变了,但其实变的不是tuple的元素,而是list的元素。tuple一开始指向的list并没有改成别的list,所以,tuple所谓的“不变”是说,tuple的每个元素,指向永远不变。即指向'a',就不能改成指向'b',指向一个list,就不能改成指向其他对象,但指向的这个list本身是可变的!


    集合 set

    set和dict类似,也是一组key的集合,但不存储value。由于key不能重复,所以,在set中,没有重复的key。
    要创建一个set,需要提供一个list作为输入集合:

    >>> s = set([1, 2, 3])
    >>> s
    set([1, 2, 3])
    

    注意,传入的参数[1, 2, 3]是一个list,而显示的{1, 2, 3}只是告诉你这个set内部有1,2,3这3个元素,显示的顺序也不表示set是有序的。

    重复元素在set中自动被过滤:

    >>> s = set([1, 1, 2, 2, 3, 3])
    >>> s
    set([1, 2, 3])
    

    通过add(key)方法可以添加元素到set中,可以重复添加,但不会有效果:

    >>> s = set([1, 2, 3, 5, 6, 7, 9])
    >>> s
    set([1, 2, 3, 5, 6, 7, 9])
    >>> id(s)   
    140415072840960
    >>> s.add(4)
    >>> id(s)   
    140415072840960
    >>> s
    set([1, 2, 3, 4, 5, 6, 7, 9])
    

    通过remove(key)方法可以删除元素:

    >>> s.remove(4)
    >>> s
    set([1, 2, 3, 5, 6, 7, 9])
    

    set可以看成数学意义上的无序和无重复元素的集合,因此,两个set可以做数学意义上的交集、并集等操作:

    >>> s1 = set([1, 2, 3])
    >>> s2 = set([2, 3, 4])
    # 交集
    >>> s1 & s2 
    set([2, 3])
    # 并集
    >>> s1 | s2
    set([1, 2, 3, 4])
    # 差集
    >>> s1 - s2
    set([1])
    # 对称差集,不同时出现在两个集合中的元素
    >>> s1 ^ s2
    set([1, 4])
    

    set和dict的唯一区别仅在于没有存储对应的value,但是,set的原理和dict一样,所以,同样不可以放入可变对象,因为无法判断两个可变对象是否相等,也就无法保证set内部“不会有重复元素”。

    set 中的方法

    • s.copy():返回s的副本
    • s.difference(t):求差集。返回所有在s中,但不在t中的元素
    • s.intersection(t):求交集。返回所有同时在s和t中的元素
    • s.union(t):求并集。返回所有在s或t中项目
    • s.symmetric_difference(t):求对称差集,不同时出现在两个集合中的元素
    • s.isdisjoint(t):如果s和t没有相同的元素,返回True
    • s.issubset(t):如果s是t的一个子集,返回True
    • s.issuperset(t):如果s是t的一个超集,返回True
  • 相关阅读:
    BZOJ 1565 植物大战僵尸
    BZOJ 1497 最大获利(最大权闭合子图)
    BZOJ 1070 修车(最小费用流)
    BZOJ 2879 NOI2012美食节
    PHPCMS模板里面使用自定义函数
    邓_phpcms_数据库
    邓_ phpcms_
    dedecms====phpcms 区别==[工作]
    邓_html_图片轮播
    dedecms_插件
  • 原文地址:https://www.cnblogs.com/wshenjin/p/7192294.html
Copyright © 2011-2022 走看看