python基础(三)list, tuple, dict, set

整理自廖雪峰python教程

https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014316724772904521142196b74a3f8abf93d8e97c6ee6000

目录

1. list:list里面的元素的数据类型可以不同(广义表?)

 2.tuple:一旦初始化就不能修改(不能增长缩短,改变元素)

 3.dict: 字典,键值对

4.set:set可以看成数学意义上的无序和无重复元素的集合

5.切片操作


 


1. list:list里面的元素的数据类型可以不同(广义表?)

>>> classmates = ['Michael', 'Bob', 'Tracy']       //初始化列表
>>> classmates
['Michael', 'Bob', 'Tracy']
>>> len(classmates)            //返回列表长度
3

>>> classmates[-1]               //可以用-1返回最后一个元素,以此类推,可以获取倒数第2个、倒数第3个:
'Tracy'

>>> classmates.append('Adam')            //在最后面添加元素
>>> classmates
['Michael', 'Bob', 'Tracy', 'Adam']

>>> classmates.insert(1, 'Jack')            //在任意位置插入元素,之后元素后移
>>> classmates
['Michael', 'Jack', 'Bob', 'Tracy', 'Adam']

>>> classmates.pop()                        //删除最后一个元素,pop(i)可删除第i位置元素
'Adam'
>>> classmates
['Michael', 'Jack', 'Bob', 'Tracy']

 2.tuple一旦初始化就不能修改(不能增长缩短,改变元素)

>>> classmates = ('Michael', 'Bob', 'Tracy')

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

    tuple的陷阱:

    要定义一个只有1个元素的tuple,如果你这么定义:

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

定义的不是tuple,是1这个数!这是因为括号()既可以表示tuple,又可以表示数学公式中的小括号,这就产生了歧义,因此,Python规定,这种情况下,按小括号进行计算,计算结果自然是1

所以,只有1个元素的tuple定义时必须加一个逗号,,来消除歧义

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

 tuple所谓的“不变”是说,tuple的每个元素,指向永远不变

//这里貌似改变了tuble,但是其实是改变了“可变的”列表,tuble元素指向这个列表的地址没有改变
>>> t = ('a', 'b', ['A', 'B'])
>>> t[2][0] = 'X'
>>> t[2][1] = 'Y'
>>> t
('a', 'b', ['X', 'Y'])

 3.dict: 字典,键值对

>>> d = {'Michael': 95, 'Bob': 75, 'Tracy': 85}
>>> d['Michael']
95

//把数据放入dict的方法,除了初始化时指定外,还可以通过key放入:

>>> d['Adam'] = 67
>>> d['Adam']
67

//由于一个key只能对应一个value,所以,多次对一个key放入value,后面的值会把前面的值冲掉:

>>> d['Jack'] = 90
>>> d['Jack']
90
>>> d['Jack'] = 88
>>> d['Jack']
88
//如果key不存在,dict就会报错:
//要避免key不存在的错误,有两种办法,一是通过in判断key是否存在:
>>> 'Thomas' in d
False

//二是通过dict提供的get()方法,如果key不存在,可以返回None,或者自己指定的value:

>>> d.get('Thomas')
>>> d.get('Thomas', -1)
-1
//注意:返回None的时候Python的交互环境不显示结果。

//要删除一个key,用pop(key)方法,对应的value也会从dict中删除:
>>> d.pop('Bob')
75
>>> d
{'Michael': 95, 'Tracy': 85}

dict可以用在需要高速查找的很多地方,在Python代码中几乎无处不在,正确使用dict非常重要,需要牢记的第一条就是dict的key必须是不可变对象

这是因为dict根据key来计算value的存储位置,如果每次计算相同的key得出的结果不同,那dict内部就完全混乱了。这个通过key计算位置的算法称为哈希算法(Hash)。

要保证hash的正确性,作为key的对象就不能变。在Python中,字符串、整数等都是不可变的,因此,可以放心地作为key。而list是可变的,就不能作为key。

4.set:set可以看成数学意义上的无序和无重复元素的集合

set和dict类似,也是一组key的集合,但不存储value。由于key不能重复,所以,在set中,没有重复的key。

要创建一个set,需要提供一个list作为输入集合:

//重复元素会被过滤
>>> s = set([1, 1, 2, 2, 3, 3])
>>> s
{1, 2, 3}
//通过add(key)方法可以添加元素到set中,可以重复添加,但不会有效果:
>>> s.add(4)
>>> s
{1, 2, 3, 4}
//通过remove(key)方法可以删除元素:
>>> s.remove(4)
>>> s
{1, 2, 3}

//set可以求交集,并集
>>> s1 = set([1, 2, 3])
>>> s2 = set([2, 3, 4])
>>> s1 & s2                    //交集
{2, 3}
>>> s1 | s2                    //并集
{1, 2, 3, 4}

 set的原理和dict一样,所以,同样不可以放入可变对象,用add()加入列表会报错

5.切片操作

可以通过切片产生一个变量的副本(新变量与旧变量指向的地址不再相同)

你要记住如果你希望创建一份诸如序列等复杂对象的副本(而非整数这种简单的对象(Object)),你必须使用切片操作来制作副本。

shoplist = ['apple', 'mango', 'carrot', 'banana']
# mylist 只是指向同一对象的另一种名称
mylist = shoplist

# 通过生成一份完整的切片制作一份列表的副本
mylist = shoplist[:]
 L = ['Michael', 'Sarah', 'Tracy', 'Bob', 'Jack']

#取L的前3个数(从索引0开始,到3结束,不包括3)
>>> L[0:3]                            #如果第一个索引是0,可以省略为 L[:3]
['Michael', 'Sarah', 'Tracy']

#倒数切片
>>> L[-2:]
['Bob', 'Jack']
>>> L[-2:-1]
['Bob']

#切片操作十分有用。我们先创建一个0-99的数列:
>>> L = list(range(100))
#前10个数,每两个取一个:
>>> L[:10:2]
[0, 2, 4, 6, 8]
#所有数,每5个取一个:
>>> L[::5]
[0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95]

#tuple也可以用切片操作,只是操作的结果仍是tuple:
>>> (0, 1, 2, 3, 4, 5)[:3]
(0, 1, 2)

#字符串也可以用切片操作,只是操作结果仍是字符串:
>>> 'ABCDEFG'[:3]
'ABC'
>>> 'ABCDEFG'[::2]
'ACEG'

>>> shoplist = ['apple', 'mango', 'carrot', 'banana']
>>> shoplist[::-1]
['banana', 'carrot', 'mango', 'apple']          //步长为-1时,倒过来

猜你喜欢

转载自blog.csdn.net/fhb362767625/article/details/86018123