zoukankan      html  css  js  c++  java
  • Python学习日记(四) 集合和元祖

    元祖的特性:是一个只读列表、可以循环、可以切片,修改数据遵循'儿子'不能改但'孙子'可能可以改。

    iterable:可迭代对象(元祖、列表、字串、集合)

    元祖宣告方式:

    tu = (1,2,3,['a','b',1],'str') #(1, 2, 3, ['a', 'b', 1], 'str')

    元祖索引切片:

    tu = (1,2,3,['a','b',1],'str') #(1, 2, 3, ['a', 'b', 1], 'str')
    print(tu[1])    #2
    print(tu[-2])   #['a', 'b', 1]
    print(tu[1:3])  #(2, 3)
    print(tu[-1:2:-1]) #('str', ['a', 'b', 1])
    print(tu[::1])  #(1, 2, 3, ['a', 'b', 1], 'str')
    print(tu[::-2]) #('str', 3, 1)

    查:

    for i in tu:
        print(i)
    #1
    #2
    #3
    #['a', 'b', 1]
    #str

    tu.index():

    通过元素找索引,可以切片,找到该元素则返回第一个元素索引值,找不到则报错

    print(tu[::-2].index(3))    #1
    print(tu.index(['a','b',1]))    #3

    tu.count():

    tu = (1,2,3,['a','b',1],'str',2,2) 
    print(tu.count(2))  #3

    len(tu):

    tu = (1,2,3,['a','b',1],'str',2,2) 
    print(len(tu))  #7

    改:

    因为元祖为只读列表里面的数据不能改动,但是其子元素内部的元素可能可以改动。

    tu =((1,2,'a'),['a','b',1],'a',1,{1,2})
    tu[0][2] = 'z' print(tu) #'tuple' object does not support item assignment tu[1][2] = 'z' print(tu) #((1, 2, 'a'), ['a', 'b', 'z'], 'a', 1, {1, 2}) tu[2] = 'z' print(tu) #'tuple' object does not support item assignment tu[3] = 1 print(tu) #'tuple' object does not support item assignment tu[4][0]= 5 print(tu) #'set' object does not support item assignment

    集合的特性:集合本身是一个可变的数据类型,但其中的元素是不可变的数据类型。它也有着无序、不重复的特点。

    把一个列表转成集合就可以做到去重复的效果。

    集合宣告方式:

    当创建一个空集合时要用set(),不能用{ }

    a = set()   #set()
    b = set({1,'a',False,'a'})  #{False, 1, 'a'}
    c = {1,2,'a','c','c'}  #{1, 2, 'c', 'a'}

    增:

    set.add():

    将元素无序的添加至集合中,若该元素已存在则不进行任何操作

    a = set({1,2,3,'a',(1,2)})
    a.add(1)
    print(a)        #{(1, 2), 1, 2, 3, 'a'}
    
    a.add('ab')
    print(a)        #{(1, 2), 1, 2, 3, 'ab', 'a'}

    set.update():

    将元素迭代并无序加入以逗号隔开

    a = set({1,2,3,'a',(1,2)})
    a.update('abc')     #{(1, 2), 1, 2, 3, 'b', 'c', 'a'}
    a.update({'key1' : 12,'key2' : 'c','key3' : 0})     #{(1, 2), 1, 2, 3, 'key2', 'key3', 'key1', 'a'}
    a.update([6,5])     #{(1, 2), 1, 2, 3, 5, 6, 'a'}
    a.update((1,9,'a')) #{(1, 2), 1, 2, 3, 9, 'a'}
    a.update(set({5,6})) #{(1, 2), 1, 2, 3, 5, 6, 'a'}

    删:

    set.pop():

    随机删除集合中的一个元素,并返回结果

    a = set({1,2,3,'a',(1,2)})
    print(a.pop())  #(1, 2)
    
    b = set()
    print(b.pop())  #'pop from an empty set'

    set.remove():

    在集合中删除一个元素,如果元素不存在则返回错误

    a = set({1,2,3,'a',(1,2)})
    a.remove(1) 
    print(a)    #{(1, 2), 2, 3, 'a'}
    a.remove(1)
    print(a)    #KeyError: 1

    set.clear():

    清空整个集合

    a = set({1,2,3,'a',(1,2)})
    a.clear()
    print(a)    #set()

    del:

    删除该集合

    a = set({1,2,3,'a',(1,2)})
    del a
    print(a)    #name 'a' is not defined

    set.discard():

    移除集合中的某个元素,若果元素不存在则不会报错

    a = set((1,'a',5))
    a.discard(1)    #{5, 'a'}
    print(a)
    
    b = set(((1,'a',5),2))
    b.discard(1)    #{2, (1, 'a', 5)}
    print(b)

    改:

    因为集合内部为不可变数据类型所以无法修改其中的元素。

    查:

    a = {1,2,'a',False,'abc'}
    for i in a:
        print(i)
    #False
    #1
    #2
    #abc
    #a

    求交集:

    交集定义:集合论中,设AB是两个集合,由所有属于集合A且属于集合B的元素所组成的集合,叫做集合A与集合B的交集(intersection),记作AB。

    a = {1,2,3,4}
    b = {2,4,5,6}
    print(a & b)    #{2, 4}
    print(a.intersection(b))    #{2, 4}

    求并集:

    并集定义:给定两个集合A,B,把他们所有的元素合并在一起组成的集合,叫做集合A与集合B的并集,记作A∪B。

    a = {1,2,3,4}
    b = {2,4,5,6}
    print(a | b)    #{1, 2, 3, 4, 5, 6}
    print(a.union(b))   #{1, 2, 3, 4, 5, 6}

    求反交集:

    a = {1,2,3,4}
    b = {2,4,5,6}
    print(a ^ b)    #{1, 3, 5, 6}
    print(a.symmetric_difference(b))    #{1, 3, 5, 6}

    求差集:

    就是找前面一个集合独有的

    a = {1,2,3,4}
    b = {2,4,5,6}
    print(a - b)    #{1, 3}
    print(a.difference(b))  #{1, 3}
    print(b - a)    #{5, 6}
    print(b.difference(a))  #{5, 6}

    判断是否为子集:

    若原集合中的所有元素都包含在指定集合中,返回True,否则返回False

    a = {1,2,3}
    b = {'a',1,2,3,4,5,6}
    print(a < b)    #True
    print(a.issubset(b))    #True

    判断是否为超集:

    判断指定集合中的元素是否包含在原集合中,有则返回True,否则返回False

    a = {1,2,3}
    b = {'a',1,2,3,4,5,6}
    print(b > a)    #True
    print(b.issuperset(a))    #True

    其他:

    1.将列表中的元素去重复成一个新的列表(不考虑算法)

    a = [1,2,2,33,33,5,6,7,'a','b','a']
    a = list(set(a))
    print(a)    #[1, 2, 33, 'b', 5, 6, 7, 'a']

    2.将set()转变为不可变数据类型

    a = set({1,2,'a'})
    b = {5,7,a}
    print(b)    #unhashable type: 'set'
    a = set({1,2,'a'})
    a = frozenset(a)    
    print(a,type(a))    #frozenset({1, 2, 'a'}) <class 'frozenset'>
    b = {a,4,5}
    print(b)    #{4, 5, frozenset({1, 2, 'a'})}

    3.什么元素转化为布尔值为False?

    0、[]、()、{}、set()、' '

    4.数字和元祖

    tu1 = ((100))
    tu2 = ((100,))
    print(tu1,type(tu1))    #100 <class 'int'>
    print(tu2,type(tu2))    #(100,) <class 'tuple'>

    元祖里面只有一个元素且不加逗号,那么此元素是什么类型就是什么类型

    5.当for循环删除列表中元素时都会产生一个新的列表

    li = [1,2,3,4,5,6]
    for i in range(len(li)):
        del li[i]
        print(li)
    
    #第一次删除 i = 0,对应索引值 li[i] = 1,删除后列表 li = [2, 3, 4, 5, 6]
    #第二次删除 i = 1,对应索引值 li[i] = 3,删除后列表 li = [2, 4, 5, 6]
    #第三次删除 i = 2,对应索引值 li[i] = 5,删除后列表 li = [2, 4, 6]
    #第四次删除 i = 3,报错 因为到这时候列表的长度是3,小于元素的索引值

    将奇数位的数删除:

    方法一

    li = [1,2,3,4,5,6]
    li = li[::2]
    print(li)

    方法二

    li = [1,2,3,4,5,6]
    l1 = []
    for i in li:
        if li.index(i) % 2 == 0:
            l1.append(i)
    li = l1
    print(li)   #[1, 3, 5]

    6.在遍历一个字典时,不能删除它的键值对

    若要删除字典中含'k'的元素:

    dic = {'key1' : 2,
           'key2' : 3,
           'key3' : 'a',
           'aey4' : 5}
    for i in dic:
        if 'k' in i:
            del dic[i]  #RuntimeError: dictionary changed size during iteration

    解决方案:

    方法一:

    dic1 = {}
    for i in dic:
        if 'k' not in i:
            dic1.setdefault(i,dic[i])
    dic = dic1
    print(dic)  #{'aey4': 5}

    方法二:

    l = []
    for i in dic:
        if 'k' in i:
            l.append(i)
    for i in l:
        del dic[i]
    print(dic)  #{'aey4': 5}
  • 相关阅读:
    限制CPU个数
    delphi 不阻塞提示对话框
    快捷打开vnc 某个连接
    delphi ShellExecute 传递多个参数
    JS对JSON的操作总结 (转)
    Windows Server 2008 IIS下部署网站出现的问题
    SqlParameter序列化的问题
    求解,工作流点通过时,弹出窗口让用户录入审核意见
    oracle调度
    c# 多态
  • 原文地址:https://www.cnblogs.com/Fantac/p/11247911.html
Copyright © 2011-2022 走看看