zoukankan      html  css  js  c++  java
  • python 字典,列表,集合,字符串,基础进阶

    python列表基础
    
    首先当然是要说基础啦
    列表list
    1、L.append(object) -> None
        在列表末尾添加单个元素,任何类型都可以,包括列表或元组等
     
    2、L.extend(iterable) -> None
        以序列的形式,在列表末尾添加多个元素
     
    3、L.insert(index, object) -> None
       在index位置处添加一个元素
     
    4、L.clear() -> None
       清除列表所有元素,成为空列表
     
    5、L.copy() -> list
       获得一个列表副本
     
    6、L.count(A) -> integer
       返回A在列表中出现的次数
     
    7、L.index(A, [start, [stop]])
       返回A在列表中第一次出现的位置,可以指定开始和结束位置  注意:[start,end)
     
    8、L.pop([index]) -> integer
       弹出对应位置的元素,不填参数,默认弹出最后一个元素
     
    9、L.remove(A) -> None
       删除第一个元素A,其余元素A不擅长
     
    10、L.sort(key=None, reverse=False) -> None
       对列表进行排序,默认是升序。如果reverse=True,则改为降序。可以给key参数传递一个函数,如lambda或事先定义好的。然后按照这个函数定义以什么为排序基础,      例如以最后一个数字为排序基础,或以下划线后的数字为排序基础等。
       此方法会改变列表排序
     
    11、L.reverse() -> None
        对列表进行降序
        此方法会改变列表排序
     
    元组tuple
    1、T.count(A) -> integer
       返回A在元祖中出现的次数
     
    2、T.index(A, [start, [stop]]) -> integer
       返回A在元祖中第一次出现的位置,可以指定开始和结束范围  注意:[start,end)
     
     
     集合set
    1、S.add(element) -> None
       添加一个元素到集合里
     
    2、S.clear() -> None
       清除集合所有元素
     
    3、S.copy() -> set
       返回原集合的副本
     
    4、S.remove(element) -> None
       移除集合中的一个元素,如果该元素不在集合中则报错
     
    5、S.discard(element) -> None
       同上,但如果该元素不在集合中不报错
     
    6、S.pop() -> element
       随机弹出一个原集合的元素
     
    7、S.isdisjoint(S2) -> bool
       如果两个集合没有交集,则返回True
     
    8、S.issubset(S2) -> bool
       如果S2(序列或者集合)集合包含S集合,则返回True
     
    9、S.issuperset(S2) -> bool
       如果S集合包含S2(序列或者集合)集合,则返回True
     
    10、S.difference_update(S2) -> None
       S减去S和S2(序列或者集合)的交集,不返回任何值,
       此方法会改变原集合S
     
    11、S.intersection_update(S2) -> None
       S和S2(序列或者集合)的交集,不返回任何值,
       此方法会改变原集合S
     
    12、S.symmetric_difference_update(S2) -> None
       S和S2的并集减去S和S2的交集,不返回任何值
       此方法会改变原集合S
     
    13、S.update(S2) -> None
       S和S2(序列或者集合)的并集,不返回任何值,
       此方法会改变原集合S
                        
    14、S.intersection(S2) -> set
       返回S和S2(序列或者集合)的交集
     
    15、S.difference(S2) -> set
       返回S减去S和S2(序列或者集合)的交集
     
    16、S.symmetric_difference(S2) -> set
       返回S和S2的并集减去S和S2的交集,S2可以是序列或集合
     
    17、S.union(S2) -> set
       返回S和S2(序列或者集合)的并集
     
    字典dict
    1、D.clear() -> None
       清除字典中所有键值
     
    2、D.copy() -> D
       返回一个字典的副本
     
    3、D.pop(k[,d]) -> value
       弹出k键对应的值,并移除键值。如果k键没有被找到,但设置了d的值,则返回d的值。如果没设置的d值的话,又没找到k键,则报错。
     
    4、D.popitem() -> (k, v)
       以元祖的形式,弹出一个键值(弹出的一般是堆栈的第一个键值)
     
    5、D.keys() -> a set-like object
       已类似列表的形式返回所有键(其实返回的更像是类列表的对象,并不会对重复的值进行处理)
     
    6、D.values() -> a set-like object  
       已类似列表的形式返回所有值(其实返回的更像是类列表的对象,并不会对重复的值进行处理)
     
    7、D.items() -> a set-like object
       已类似列表的形式返回所有键值,每个键值以元祖的形式返回(其实返回的更像是类列表的对象,并不会对重复的值进行处理)
     
    8、D.get(k[,d]) -> D[k] if k in D, else d.
       如果字典存在k键则返回对应的值,如果不存在,但填了d值则返回d值,否则返回空值
     
    9、D.setdefault(k[,d]) -> D.get(k,d), also set D[k]=d if k not in D
       如果字典存在k键则返回对应的值,如果不存在,但填了d值则在原字典中建立新的键值,并返回该值。但没有填d值的话,则设在k键对应为空值。
     
    10、D.update(D2) -> None
       D2也是字典。将D2的键值合并到D中,如果存在相同的键,则D2覆盖D
       此方法会改变原字典D
     
    11、D.fromkeys(iterable, value=None) -> dict
       此方法用于创建字典。以可迭代的对象的所有元素作为键,value作为唯一的值。返回一个多键对单一值的字典(不论D是不是空字典结果都是一样的)
     
    字符串str
    1、S.capitalize() -> str  
       将首字母转换成大写,需要注意的是如果首字没有大写形式,则返回原字符串
     
    2、S.upper() -> str   
       将原字符串中所有的字母大写
     
    3、S.lower() -> str
       将原字符串中所有的字母小写(只能完成ASCII码中的A-Z)
     
    4、S.casefold() -> str
       将原字符串中所有的字母小写(能识别更多的对象将其输出位小写)
     
    5、S.swapcase() -> str
       将原字符串中存在的字母大小写互换
     
    6、S.replace(old, new[, count]) -> str
       替换字符。count参数代表替换几次old字符。如果不填count参数,默认替换所有的old字符
     
    7、S.expandtabs(tabsize=8) -> str
       将字符串中所有制表符(	)替换为空格,替换空格数默认为7(8-1,其中tabsize=0表示去掉	,tabsize=1或2都表示一个空格,其余为n-1个空格)
     
    8、S.rjust(width[, fillchar]) -> str
       如果原字符长度不足width,则剩余部分,在左边补齐空格。如果有填充单字符,则用字符代替空格。(注意:只能是单字符)
     
    9、S.ljust(width[, fillchar]) -> str
       同上。不过是在右边填充。
     
    10、S.center(width[, fillchar]) -> str
       同上。不过左右两边同时填。多出的部分填在右边
     
    11、S.zfill(width) -> str
       如果原字符长度不足width,则剩余部分,在左边补齐0
     
    12、S.find(sub[, start[, end]]) -> int
       返回子字符串在原字符串中第一次出现的位置,可以指定开始和结束位置。如果子字符串不在原字符串中则返回-1  注意:[start,end)
     
    13、S.index(sub[, start[, end]]) -> int
       同上,不过如果子字符串不在原字符串中则报错    注意:[start,end)
     
    14、S.rindex(sub[, start[, end]]) -> int
       同index,不过是从字符串右到左,不过返回的是子字符串最左边的第一个字符位置
     
    15、S.rfind(sub[, start[, end]]) -> int
       同find,不过是从字符串右到左,不过返回的是子字符串最左边的第一个字符位置
     
    16、S.split(sep=None, maxsplit=-1) -> list of strings
       返回一个以sep作为分隔符得到的列表。maxsplit代表分隔几次,默认为全分隔
     
    17、S.rsplit(sep=None, maxsplit=-1) -> list of strings
       同上。不过是从右至左
     
    18、S.splitlines([keepends]) -> list of strings
       返回一个按换行符作为分隔符得到的列表。默认keepends为False,表示得到的列表,列表的元素都去掉了换行符。如果改为True则保留换行符
     
    19、S.partition(sep) -> (head, sep, tail)
       此方法用来根据指定的分隔符将字符串进行分割。如果字符串包含指定的分隔符,则返回一个3元的元组。第一个为分隔符左边的子串,第二个为分隔符本身,第三个为分隔符右边的子串。
       如果不包含指定的分隔符,则第一个为原字符串,第二三个为空字符
     
    20、S.rpartition(sep) -> (head, sep, tail)
       同上,但是从右至左,且如果不包含指定的分隔符,则第一二个为空字符,第二个为原字符串
     
    21、strip([chars]) -> str
       默认返回一个去掉左右两边空格的字符串。如果参数写了子字符,则去掉左右两边所有的子字符
     
    22、S.rstrip([chars]) -> str
       同上,但是只去掉右边的字符
     
    23、S.lstrip([chars]) -> str
        同上,但是只去掉左边的字符
     
    24、S.startswith(prefix[, start[, end]]) -> bool
        判断字符串是否以某字符串开头,如果是,则True。可以指定开始和结束位置
     
    25、S.endswith(suffix[, start[, end]]) -> bool
        同上,不过判断的是结尾
     
    26、S.count(sub[, start[, end]]) -> int
       返回子字符串在原字符串中出现的次数。可以指定开始和结束位置
     
    27、S.join(iterable) -> str
       将原字符填充到序列的元素之间
     
    28、S.encode(encoding='utf-8', errors='strict') -> bytes
       编码,errors参数可选很多,其中有’ignore’
     
    29、S.isidentifier() -> bool
       是否为Python的关键字等,如果是为True
     
    30、S.isalnum() -> bool
       是否字符串全是由数字、英文或汉字组成(包括罗马数字等),如果是为True
     
    31、S.isdecimal() -> bool
       是否字符串只含有10进制数字
       True:Unicode数字,全角数字(双字节)
       False:罗马数字,汉字数字
       Error:byte数字(单字节)
     
    32、S.isnumeric() -> bool
       是否字符串只含有数字
       True:Unicode数字,全角数字(双字节),罗马数字,汉字数字
       False:无
       Error:byte数字(单字节)
     
    33、S.isdigit() -> bool
       是否字符串只含有数字
       True:Unicode数字,byte数字(单字节),全角数字(双字节),罗马数字
       False:汉字数字
       Error:无
     
    34、S.isspace() -> bool
       是否字符串只含有空格(空格,制表符,换行符),如果是为True
     
    35、S.isalpha() -> bool
       是否字符串只含有字母,如果是为True
     
    36、S.islower() -> bool
       是否字符串中所有的字母都是小写(可以含非字母的字符),如果是为True
     
    37、S.isupper() -> bool
       如果原字符串中的字母(可以包含其他内容,如数字)全为大写,返回True
     
    38、S.isprintable() -> bool
       是否字符串中所有字符是可见状态(例如
    不可见),如果是为True
     
    39、S.istitle() -> bool
       是否字符中每个单词的首写字母都大写了(字符中除字母外,只允许有空格和正常的标点符号),如果是为True
     
    40、S.maketrans(x, y=None, z=None) -> dict
       
       
    41、S.translate(table) -> str
       参考上面语句(这里的table指的是字典映射表)
     
    42、S.format_map(mapping) -> str
       
       注意:键不能为纯数字
     
    43、S.title() -> str
       字符中每个单词的首写字母都大写(允许各种字符在中间隔断)
    
    
    
    
    
    
    List(列表) 是 Python 中使用最频繁的数据类型。
    列表可以完成大多数集合类的数据结构实现。它支持字符,数字,字符串甚至可以包含列表(即嵌套)。
    列表用” [ ] “标识,是 python 最通用的复合数据类型。
    
    
    
    
    创建列表的几种方法
    
    
    默认方法  
    
    
    
    
    list1 = [0,1,2,3,4,5,6]
    >>>list1
    [0,1,2,3,4,5,6]123
    
    
    使用range()函数
    
    
    
    
    list2 = list(range(10))
    >>>list2
    [0,1,2,3,4,5,6,7,8,9]
    
    list3 = list(range(5,10))
    >>>list3
    [5,6,7,8,9]
    
    list4 = list(range(0,10,2)) #这里的"2"为步长
    >>>list4
    [0,2,4,6]1234567891011
    
    
    列表生成式
    
    
    
    
    a = [number for number in range(6)]
    >>>a
    [1,2,3,4,5]123
    
    
    使用字符串创建列表
    
    
    
    
    #按住字符串的个数分割列表包括空格等字符
    a = list("123456")
    >>>a
    ['1','2','3','4','5','6']
    
    b = list("1,2,3,4")
    >>>b
    ['1',',','2',',','3',',',4']12345678
    
    
    使用元组创建列表
    
    
    
    
    a = list((0,1,2,3,4,5,6))
    >>>a
    [0,1,2,3,4,5,6]123
    
    
    
    访问列表的几种方法
    
    
    指定位置访问列表元素
    
    
    
    
    #注意列表的访问是从0开始
    bicycles = ['trek', 'cannondale', 'redline', 'specialized']
    >>>print(bicycles[0])
    trek
    
    >>>print(bicycles[1])
    cannondale
    
    #访问位置从后边开始
    >>>print(bicycles[-1])
    specialized1234567891011
    
    
    循环访问列表 
    遍历整个列表
    
    
    
    
    magicians = ['alice', 'david', 'carolina']
    for magician in magicians:
        print(magician) 
    
    
    alice
    david
    carolina12345678
    
    
    
    列表的修改
    
    
    指定位置直接修改  
    
    
    
    
    motorcycles = ['honda', 'yamaha', 'suzuki']
    print(motorcycles)
    motorcycles[0] = 'ducati'
    print(motorcycles)1234
    
    
    
    ['honda', 'yamaha', 'suzuki']
    ['ducati', 'yamaha', 'suzuki']12
    
    
    
    列表的添加
    
    
    使用append添加列表的元素
    
    
    
    
    motorcycles = ['honda', 'yamaha', 'suzuki']
    print(motorcycles)
    
    #append是将添加的元素追加到列表的末尾
    motorcycles.append('ducati')
    print(motorcycles)123456
    
    
    
    ['honda', 'yamaha', 'suzuki']
    ['honda', 'yamaha', 'suzuki', 'ducati']12
    
    
    使用insert()在指定位置插入元素 
    insert() 可在列表的任何位置添加新元素。为此,你需要指定新元素的索引和值。
    
    
    
    
    motorcycles = ['honda', 'yamaha', 'suzuki']
    motorcycles.insert(0, 'ducati')
    print(motorcycles)123
    
    
    
    ['ducati', 'honda', 'yamaha', 'suzuki']1
    
    
    
    从列表中删除元素
    
    
    使用del语句删除元素 
    使用 del 可删除任何位置处的列表元素,条件是知道其索引
    注意!:使用 del 语句将值从列表中删除后,你就无法再访问它了。
    
    
    
    
    motorcycles = ['honda', 'yamaha', 'suzuki']
    print(motorcycles)
    del motorcycles[0]
    print(motorcycles)1234
    
    
    
    ['honda', 'yamaha', 'suzuki']
    ['yamaha', 'suzuki']12
    
    
    使用pop()删除元素
    
    方法 pop() 可删除列表末尾的元素,并让你能够接着使用它
    术语 弹出 ( pop )源自这样的类比:列表就像一个栈,而删除列表末尾的元素相当于弹出栈顶元素
    
    motorcycles = ['honda', 'yamaha', 'suzuki']
    print(motorcycles)
    popped_motorcycle = motorcycles.pop()
    print(motorcycles)
    print(popped_motorcycle)12345
    
    ['honda', 'yamaha', 'suzuki']
    ['honda', 'yamaha']
    suzuki123
    
    术语 弹出 ( pop )源自这样的类比:列表就像一个栈,而删除列表末尾的元素相当于弹出栈顶元素
    每当你使用 pop() 时,被弹出的元素就不再在列表中了
    如果你要从列表中删除一个元素,且不再以任何方式使用它,就使用 del 语句;如果你要在删除元 
    素后还能继续使用它,就使用方法 pop() 。
    
    motorcycles = ['honda', 'yamaha', 'suzuki']
    first_owned = motorcycles.pop(0)
    print('The first motorcycle I owned was a ' + first_owned + '.')  123
    
    The first motorcycle I owned was a honda. 1
    根据值删除元素
    
    
    
    
    motorcycles = ['honda', 'yamaha', 'suzuki', 'ducati']
    print(motorcycles)
    motorcycles.remove('ducati')
    print(motorcycles)1234
    
    
    
    ['honda', 'yamaha', 'suzuki', 'ducati']
    ['honda', 'yamaha', 'suzuki']12
    
    
    使用 remove() 从列表中删除元素 
    注意!:方法 remove() 只删除第一个指定的值。如果要删除的值可能在列表中出现多次,就需要使用循环来判断是否删除了所有这样的值。
    
    
    
    
    motorcycles = ['honda', 'yamaha', 'suzuki', 'ducati']
    print(motorcycles)
    too_expensive = 'ducati'
    motorcycles.remove(too_expensive)
    print(motorcycles)
    print("
    A " + too_expensive + " is too expensive for me.")123456
    
    
    
    ['honda', 'yamaha', 'suzuki', 'ducati']
    ['honda', 'yamaha', 'suzuki']
    A Ducati is too expensive for me.123
    
    
    
    列表进阶
    
    
    
    对列表进行操作的小方法
    
    
    使用方法 sort()  对列表进行永久性排序
    
    
    
    
    #这里请注意sort()是必须吸先对列表进行排序才可以输出
    #这里是按照首字母排序的
    cars = ['bmw', 'audi', 'toyota', 'subaru']
    cars.sort()
    print(cars)12345
    
    
    
    ['audi', 'bmw', 'subaru', 'toyota']1
    
    
    你还可以按与字母顺序相反的顺序排列列表元素,为此,只需向 sort() 方法传递参数 reverse=True 
    
    
    
    
    cars = ['bmw', 'audi', 'toyota', 'subaru']
    cars.sort(reverse=True)
    print(cars)123
    
    
    
    ['toyota', 'subaru', 'bmw', 'audi']1
    
    
    使用函数 sorted()  对列表进行临时排序 
    注意:这里的sorted()是临时的,并没有改变原来列表的结构。
    注意:sort()必须是先申明再进行输出而sorted()则可以直接在print()语句中使用
    
    
    
    
    cars = ['bmw', 'audi', 'toyota', 'subaru']
    print("Here is the original list:")
    print(cars)
    print("
    Here is the sorted list:")
    print(sorted(cars))
    print("
    Here is the original list again:")
    print(cars)1234567
    
    
    
    Here is the original list:
    ['bmw', 'audi', 'toyota', 'subaru']
    Here is the sorted list:
    ['audi', 'bmw', 'subaru', 'toyota']
    Here is the original list again:
    ['bmw', 'audi', 'toyota', 'subaru']123456
    
    
    倒着打印列表
    
    
    
    
    cars = ['bmw', 'audi', 'toyota', 'subaru']
    print(cars)
    cars.reverse()
    print(cars)1234
    
    
    
    ['bmw', 'audi', 'toyota', 'subaru']
    ['subaru', 'toyota', 'audi', 'bmw']12
    
    
    确定列表的长度
    
    
    
    
     cars = ['bmw', 'audi', 'toyota', 'subaru']
     len(cars)
    
     41234
    
    
    
    列表的切片
    
    
    例子1
    
    
    
    
    players = ['charles', 'martina', 'michael', 'florence', 'eli']
    print(players[0:3])
    
    ['charles', 'martina', 'michael']1234
    
    
    例子2 
    注意!:要切记列表的下标索引是从’0’开始的
    
    
    
    
    players = ['charles', 'martina', 'michael', 'florence', 'eli']
    print(players[1:4])
    
    ['martina', 'michael', 'florence']1234
    
    
    例子3 
    如果你没有指定第一个索引, Python 将自动从列表开头开始:
    
    
    
    
    players = ['charles', 'martina', 'michael', 'florence', 'eli']
    print(players[:4])
    
    ['charles', 'martina', 'michael', 'florence']1234
    
    
    例子4 
    要让切片终止于列表末尾,也可使用下边的格式
    注意!:这种格式是包括列表末尾元素的
    
    
    
    
    players = ['charles', 'martina', 'michael', 'florence', 'eli']
    print(players[2:])
    
    ['michael', 'florence', 'eli']1234
    
    
    例子5 
    如果你要输出名单上的最后三个元素
    
    
    
    
    players = ['charles', 'martina', 'michael', 'florence', 'eli']
    print(players[-3:])
    
    ['michael', 'florence', 'eli']1234
    
    
    
    players = ['charles', 'martina', 'michael', 'florence', 'eli']
    print(players[-3:-1])
    
    ['michael', 'florence']1234
    
    
    例子6 
    这里的“2”为步长
    
    
    
    
    players = ['charles', 'martina', 'michael', 'florence', 'eli']
    print(players[1::2])12
    
    
    
    ['martina', 'florence']1
    
    
    
    遍历切片
    
    
    例子1
    
    
    
    
    players = ['charles', 'martina', 'michael', 'florence', 'eli']
    print("Here are the first three players on my team:")
    for player in players[:3]:
        print(player.title())1234
    
    
    
    Here are the first three players on my team:
    Charles
    Martina
    Michael1234
    
    
    
    列表的复制
    
    
    有一个列表,其中包含你最喜欢的四种食品,而你还想创建另一个列表,在其中包含一位朋友喜欢的所有食品。不过,你喜欢的食品,这位朋友都喜欢,因此你可以通过复制来创建这个列表 
    在不指定任何索引的情况下从列表 my_foods 中提取一个切片,从而创建了这个列表的副本,再将该副本存储到变量 friend_foods
    
    
    
    
    my_foods = ['pizza', 'falafel', 'carrot cake']
    friend_foods = my_foods[:]
    print("My favorite foods are:")
    print(my_foods)
    print("
    My friend's favorite foods are:")
    print(friend_foods)123456
    
    
    
    My favorite foods are:
    ['pizza', 'falafel', 'carrot cake']
    My friend's favorite foods are:
    ['pizza', 'falafel', 'carrot cake']1234
    
    
    给上边两个列表添加值
    
    
    
    
    my_foods = ['pizza', 'falafel', 'carrot cake']
    friend_foods = my_foods[:]
    my_foods.append('cannoli')
    friend_foods.append('ice cream')
    print("My favorite foods are:")
    print(my_foods)
    print("
    My friend's favorite foods are:")
    print(friend_foods)12345678
    
    
    
    My favorite foods are:
    ['pizza', 'falafel', 'carrot cake', 'cannoli']
    My friend's favorite foods are:
    ['pizza', 'falafel', 'carrot cake', 'ice cream']1234
    
    
    倘若我们只是简单地将 my_foods 赋给 friend_foods ,就不能得到两个列表
    
    
    
    
    my_foods = ['pizza', 'falafel', 'carrot cake']
    # 这行不通
    friend_foods = my_foods
    my_foods.append('cannoli')
    friend_foods.append('ice cream')
    print("My favorite foods are:")
    print(my_foods)
    print("
    My friend's favorite foods are:")
    print(friend_foods123456789
    
    
    
    My favorite foods are:
    ['pizza', 'falafel', 'carrot cake', 'cannoli', 'ice cream']
    My friend's favorite foods are:
    ['pizza', 'falafel', 'carrot cake', 'cannoli', 'ice cream']1234
    
    
    
    列表的深浅拷贝
    
    
    要了解拷贝就必须要知道可变类型和不可变类型
    
    不可变类型: 整型,浮点数,复数,布尔,字符串,元组 
    可变类型:列表,字典。 
    赋值:简单地拷贝对象的引用,两个对象的id相同。 
    浅拷贝:创建一个新的组合对象,这个新对象与原对象共享内存中的子对象。 
    深拷贝:创建一个新的组合对象,同时递归地拷贝所有子对象,新的组合对象与原对象没有任何关联。虽然实际上会共享不可变的子对象,但不影响它们的相互独立性。
    
    浅拷贝和深拷贝的不同仅仅是对组合对象来说,所谓的组合对象就是包含了其它对象的对象,如列表,类实例。而对于数字、字符串以及其它“原子”类型,没有拷贝一说,产生的都是原对象的引用。
    浅拷贝
    
    注意:浅拷贝和深拷贝的不同仅仅是对组合对象来说,所谓的组合对象就是包含了其它对象的对象,如列表,类实例。而对于数字、字符串以及其它“原子”类型,没有拷贝一说,产生的都是原对象的引用。 
    
    
    
    
    a = ['A', 'B', 'C']
    b = list(a)
    print(id(a), id(b))          # a和b身份不同
    print()
    for x, y in zip(a, b):       # 但它们包含的子对象身份相同
        print(id(a), id(b))123456
    
    
    
    42617288 42618248
    
    42617288 42618248
    42617288 42618248
    42617288 4261824812345
    
    
    深拷贝
    
    所谓“深拷贝”,是指创建一个新的对象,然后递归的拷贝原对象所包含的子对象。深拷贝出来的对象与原对象没有任何关联。
    深拷贝只有一种方式:copy模块中的deepcopy函数。
    
    import copy
    a = ['A', 'B', 'C']
    b = copy.deepcopy(a)
    print(id(a), id(b))
    print()
    for x, y in zip(a, b):
      print(id(x), id(y))1234567
    
    41261064 41261256
    
    36352888 36352888
    40111552 40111552
    40111440 4011144012345
    
    为什么使用了深拷贝,a和b中元素的id还是一样呢?
    答:这是因为对于不可变对象,当需要一个新的对象时,python可能会返回已经存在的某个类型和值都一致的对象的引用。而且这种机制并不会影响 a 和 b 的相互独立性,因为当两个元素指向同一个不可变对象时,对其中一个赋值不会影响另外一个。
    
    我们可以用一个包含可变对象的列表来确切地展示“浅拷贝”与“深拷贝”的区别:
    
    import copy
    a = [[1, 2], [5, 6], [8, 9]]
    
    b = copy.copy(a)              # 浅拷贝得到b
    c = copy.deepcopy(a)          # 深拷贝得到c
    print(id(a), id(b))           # a 和 b 不同
    print()
    for x, y in zip(a, b):        # a 和 b 的子对象相同
      print(id(x), id(y))
    print()
    print(id(a), id(c))           # a 和 c 不同
    print()
    
    for x, y in zip(a, c):        #a 和 c 的子对象也不同
      print(id(x), id(y))
    print(id(x), id(y))12345678910111213141516
    
    37526920 37526856
    
    37525512 37525512
    37525704 37525704
    37526984 37526984
    
    37526920 37526792
    
    37525512 37526728
    37525704 37526600
    37526984 37526536
    37526984 37526536
    --------------------- 
    一、元组(tuple)
    1.特性:不可更改的数据序列。【理解:一旦创建元组,则这个元组就不能被修改,即不能对元组进行更新、增加、删除操作】
    2.创建:一对圆括号“()”和其包含的元素(若没有元素,则为空元组)。
        创建一般元组:即一维元组。如:tempTuple = ("one","two","three",4,5,6)。
        创建嵌套元组:元组中还可以包含元组,即嵌套元组或二维(多维)元组。如:mulTuple = (("you","are","a","dog"),"you","too")。
      注:若想创建包含一个元素的元组,则必须在该元素后面加逗号“,”,否则创建的不是一个元组,而是一个字符串。
        如:aTuple = ("one",),aString = ("one")。type(aTuple) -> "tuple",type(aString) ->"string"3.访问:元组名[index],index为元素在元组中的索引,索引为整数,从0开始。注意:index不能越界,否则会报错。
        访问一般元组:tempTuple[0] -> "one",tempTuple[3] -> 4。
        访问嵌套元组:mulTuple[0][1] ->"are"。
      注:可以使用负数作为索引来访问元组。-1代表最后一个元素,-2代表倒数第二个,以此类推。如:tempTuple[-1] ->"too"。
            可用for循环遍历元组。如:for element in tempTuple: print(elment)。
    4.求长:len(元组名)。如len(tempTuple) ->6。(长度也即元组中元素的个数)。
    5.打印:print(元组名),可打印元组中的所有元素。
    6.类型:type(元组名) ->"tuple"7.删除:del 元组名,删除元组,当访问被删除的元组时会报错,提示:元组未定义。(其他类型也可以用此方法)
    二、列表(list)
    1.特性:可更改的数据数列。(区别于元组,可动态增加,删除,更新)
    2.创建:一对方括号“[]”和其包含的元素,单个元素可以不加逗号,同元组一样,可以创建嵌套列表。如:tempList = ["one","two","three"]。
    3.基本操作及方法:
      (1)访问、遍历、求长、打印、类型等操作同元组
      (2)更新:给列表中的元素重新赋值,不可给列表中不存在的元素赋值。如:tempList[2] = 3 ->tempList = ["one","two",3],tempList[3] = "four" ->报错!!!
      (3)删除:删除元素后(若不是最后一个),右边的元素会左移。
        1)del:删除指定元素。如:del tempList[0] ->tempList = ["two","three"]
        2)pop:删除指定位置的元素并返回被删除的元素,默认删除最后一个。如:element = tempList.pop(1) ->element = two,tempList = ["one","three"]。
      (4)增加(插入):
        1)append:向列表末尾添加一个元素,参数不能为空,否则报错。如:tempList.append("four") ->tempList = ["one","two","three","four"]。
        2)extend:向列表末尾添加多个元素,参数不能为空,不能是int型,可为字符串(当成列表处理,每个字符就是一个元素)、元组、列表。如:
             参数为字符串:tempList.extend("str") ->tempList = ["one","two","three","s","t","r"]。
             参数为元组或列表:tempList.extend(("four",“five”)) ->tempList = ["one","two","three","four",“five”]。
        3)list[index:index] = [value]:向列表list指定的位置index插入一个元素。如:tempList[1:1] = ["add"] -> tempList = ["one","add","two","three"].
          注:更一般的形式:listname[start:end] = 元组/列表/字符串,可插入多个元素.
    4.高级操作及方法:
      (1)产生一个数值递增列表:
          1)pList = range(N),产生一个元素值为0~N-1的列表。如:pList = range(10) ->pList = [0,1,2,3,...,9]。
          2)pList = range(sn,en),产生一个元素值为sn~en-1的列表。如:pList =  range(1,5) ->pList = [1,2,3,4]。
          3)pList = range(sn,en,inc),产生一个元素值以inc递增的列表。如:pList = range(1,10,2) ->pList = [1,3,5,7,9]
      (2)固定值初始化:pList = [value for index  in range(N)],产生一个长度为N的列表,元素值都为value.
          如:value = "x",N=10,则pLsit = ["x","x",...,"x"]
        更简单的形式:pList = [value]*N。
      (3)操作符:
        1)"+":两个列表相加,将合成为一个列表。如 pL1 = [1,2],pL2 = [3,4],pL1+pL2 ->[1,2,3,4]
        2)"*":形式:[value]*N。如value="a",N=4,则得到列表["a","a","a","a"]。
        3)deldel pL[index]:删除指定位置的元素。 del pL[sIndex:eIndex]:删除sIndex~eIndex-1位置的元素。
      (4)列表复制:
        1)pL1 = pL:pL1为pL的别名,即pL1和pL实质为同一个列表,修改其中一个列表,另一个列表也随之变化。
            如:pL = [1,2,3],pL1 = pL,pL1[2] = 33,->pL = pL1 = [1,2,33]
        2)pL2 = pL[:]:pL2为pL的一个克隆(或拷贝),即pL2和pL为不同的列表,修改其中一个列表,另一个不会受影响。
      (5)常用方法:
             1)L.append(value):向列表末尾插入一个元素
        2)L.insert(index,value):向列表的index位置插入一个元素value。
        3)L.pop(index): 从列表中删除指定位置index的元素并返回元素值,默认删除最后一个元素。
        4)L.remove(value):删除在列表中第一次出现的元素value。如:pList = [1,2,3,2],pList.remove(2) ->pList = [1,3,2]。
        5)L.count(value):返回元素value在列表中出现的次数。
        6)L.index(value) :该元素第一次出现的的位置,无则抛异常 。
        7)L.extend(list/tuple/string) :向列表末尾插入多个元素。
        8)L.sort():排序
        9)L.reverse():倒序
    三、字典(dictionary)
    1.特性:以名称索引的分组数据。元组和列表以数字顺序索引,而字典的索引可以数字,字母,字符串,符号等。
        在字典中,索引叫做:键,即key,对应的值叫做值,即value。
    2.创建:dic = {key1:value1,key2:value2},可先创建空字典dic ={},然后再初始化,如dic["one"] = "firstValue"。
        注:键是唯一的,字典只认最后一个赋的键值。如:dic = {1:1,2:2,1:3} ->dic = {1:3,2:2},最后一个元素(1:3)被“舍弃”。
    3.访问:dic[key],获得key对应的值,若key不存在,则报错。
    4.常用方法和操作:
        1)D.get(key, defualtValue):获得key对应的值,若key不存在,则返回设置的默认值defualtValue,若没有设置默认值则返回None。
        2)D.has_key(key) :检查字典中是否存在键key,有该键返回TRUE,否则FALSE。
        3)D.keys():返回由字典所有键构成的列表。
        4)D.values():返回由字典所有值构成的列表。
        5)D.items():返回由字典所有键值对构成的列表,即[(key1,value1),(key2,value2),(key3,value3),...]。
        6)D.update(dic2):将字典dic2中的元素合并到字典D中。
        7)D.popitem():随机删除字典中的一个键值对(一项),并返回值。若字典为空则抛出异常。
        8)D.clear():清空字典中的元素并返回None
        9)D.pop(key):删除指定键所对应的项,并返回key对应的值。key不能为空,也不默认删除排在最后的元素,因为字典是无序的,注意和列表的区别!!!
        10)D.copy():拷贝字典,两个字典不是同一个字典。如d = {1:1,2:2},d1 = d.copy() ->d1 = {1:1,2:2}。
        11)cmp(dict1,dict2):比较字典,(优先级为元素个数、键大小、键值大小),第一个大则返回1,第一个小则返回-1,一样大则返回0。
                   
    四、字符串(string)
    1.特性:不能修改的字符序列。除了不能修改,可把字符串当成列表一样处理。
    2.访问:访问字符串中某个字符同访问元组或列表中的元素是一样的,专业术语叫“分片(slicing)”。如:str = "aString",str[0] = "a",str[1] = "S"。
      这里不做深入讨论字符串,把字符串放在这里主要是为了说明字符串具备列表的一些特点。
    五、集合(set)
    1.特性:与字典类似,但只包含键,而没有对应的值,包含的数据不重复。
    2.创建:s = set(list or tuple or string)。重复的值在集合中只存在一个。如:
        列表list:s = set([1,2,3,3]) ->s = set([1,2,3])
        元组tuple:s = set((1,2,3))  ->s = set([1,2,3])
        字符串string:s = set("abc") ->s = set(["a","b","c"])
  • 相关阅读:
    Linux查看系统信息
    pgrep 和 pkill 使用小记
    linux下json库的编译及例程
    Epoll 实例
    gcc中的内嵌汇编语言
    BZOJ 1053: [HAOI2007]反素数ant
    2018.7.15模拟赛
    BZOJ 2002: [Hnoi2010]Bounce 弹飞绵羊
    BZOJ 4241: 历史研究
    LUOGU P2365 任务安排
  • 原文地址:https://www.cnblogs.com/duanlinxiao/p/9849161.html
Copyright © 2011-2022 走看看