python基础之list、tuple和dict以及set
11 min read

python基础之list、tuple和dict以及set

一、列表

list是一种有序的集合,可以随时添加和删除其中的元素。

①、查

列出list1中所有的元素,就可以用一个list表示

>>> list1 = ['a','b','c','d']
>>> list1
['a', 'b', 'c', 'd']

变量list1就是一个list。用len()函数可以获得list1中元素的个数:

>>> len(list1)
4

用索引来访问list1中每一个位置的元素,记得索引是从0开始的:

>>> list1[0]
'a'
>>> list1[1]
'b'
>>> list1[2]
'c'
>>> list1[3]
'd'
>>> list1[5]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: list index out of range

当索引超出了范围时,Python会报一个IndexError错误,所以,要确保索引不要越界,记得最后一个元素的索引是len(list1) - 1
如果要取最后一个元素,除了计算索引位置外,还可以用-1做索引,直接获取最后一个元素;以此类推,可以获取倒数第2个、倒数第3个:

>>> list1[-1]
'd'
>>> list1[-2]
'c'
>>> list1[-3]
'b'
②、增

list是一个可变的有序表,所以,append()可以往list中追加元素到末尾

>>> list1.append("e")
>>> list1
['a', 'b', 'c', 'd', 'e']

也可以把元素插入到指定的位置(比如索引为1的位置):

>>> list1.insert(1,520)
>>> list1
['a', 520, 'b', 'c', 'd', 'e']
③、删

要删除list末尾的元素,用pop()方法:

>>> list1.pop()
'e'
>>> list1
['a', 520, 'b', 'c', 'd']

当然pop()并不是只能删除最后一个,他也可以按照指定位置删除。

>>> list1.pop(0)
'a'
>>> list1
[520, 'b', 'c', 'd']

也可以删除指定位置的元素:

>>> del list1[0]
>>> list1
['b', 'c', 'd']

而且还可以删除某一个元素:

>>> list1.remove('d')
>>> list1
['b', 'c']
④、改

要把某个元素替换成别的元素,可以直接赋值给对应的索引位置:

>>> list1 = ['a','b','c','d']
>>> list1[0] = 521
>>> list1
[521, 'b', 'c', 'd']

tips: list列表里面的元素不一定都是字符串,也可能是整数、浮点数、列表、字典等等。
比如下面这个list,如何取出列表中的23那个值呢?

>>> list1 = [1,2,-3,3.14159,['aliez',23],'python']
>>> len(list1)
6
>>> list1[4][1]
23
⑤、对列表进行排序
  • sort()
>>> a = ['cadillac','audi','toyota','benz','byd','bmw']
>>> a.sort()
>>> a
['audi', 'benz', 'bmw', 'byd', 'cadillac', 'toyota']

可以看出来方法sort()是对列表进行了一个永久的排序,是按照字母顺序排列的。
那么如何按照字母倒序排列呢?只需在sort()函数里面加上一个reverse=True

>>> a = ['cadillac','audi','toyota','benz','byd','bmw']
>>> a.sort(reverse=True)
>>> a
['toyota', 'cadillac', 'byd', 'bmw', 'benz', 'audi']
  • sorted()
    函数sorted()能让你按照特定的顺序显示列表元素,同时不影响他们在列表中的原始排列顺序。
>>> a = ['cadillac','audi','toyota','benz','byd','bmw']
>>> print(sorted(a))
['audi', 'benz', 'bmw', 'byd', 'cadillac', 'toyota']
>>> a
['cadillac', 'audi', 'toyota', 'benz', 'byd', 'bmw']

同样是按照字母顺序排列的,那么倒序怎么排呢?其实是和方法sort()是一样的,加一个reverse=True就可以了。

>>> a = ['cadillac','audi','toyota','benz','byd','bmw']
>>> print(sorted(a,reverse=True))
['toyota', 'cadillac', 'byd', 'bmw', 'benz', 'audi']
⑥、倒着打印列表

tips: 倒着打印列表只是将列表反转,并不是按照字母的顺序相反的打印列表,只是反转列表元素的排列顺序
反转列表元素的排列顺序,可以使用方法reverse()

>>> a = ['cadillac','audi','toyota','benz','byd','bmw']
>>> a.reverse()
>>> a
['bmw', 'byd', 'benz', 'toyota', 'audi', 'cadillac']

可以看出方法reverse()是永久的修改了列表元素的排列顺序,想要恢复至原来的顺序,只需要再执行一次reverse()方法即可。

⑦、确定列表的长度

使用len()函数可以获取列表的长度。

>>> a = ['cadillac','audi','toyota','benz','byd','bmw']
>>> len(a)
6

二、元组

另一种有序列表叫元组:tuple。tuple和list非常类似,但是tuple一旦初始化就不能修改。

>>> list1 = ('a','c',3.14,'python')

现在,list1这个tuple不能变了,它也没有append(),insert()这样的方法。其他获取元素的方法和list是一样的,你可以正常地使用list1[0]list1[-1],但不能赋值成另外的元素。

>>> list1[0]
'a'
>>> list1[-1]
'python'

tips: 如果要定义一个空元组的时候,可以用下面的方式:

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

如果要定义一个只有1个元素的tuple,必须要用下面的方式来写:

>>> t = (520,)
>>> t
(520,)
>>> type(t)
<class 'tuple'>

这里为什么要多加一个逗号呢?看看下面的你就知道了。

>>> t = (520)
>>> t
520
>>> type(t)
<class 'int'>

可以看出不加逗号的时候,定义的不是一个元组,而是你括号里面的内容。
再看看下面的这个元组:

>>> t = (3.14,520,['a','b',12],'c')
>>> t = (3.14,520,['a','b',12],'c')
>>> t[2][0] = 10086
>>> t[2][2] = 'aliez'
>>> t
(3.14, 520, [10086, 'b', 'aliez'], 'c')

那么就有人有疑问了,不是说元组不可更改么?为什么这里却能更改。其实这里元组的元素确实变了,但是变的不是元组的元素,而是列表里面的元素。

三、字典

python内置字典,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度。

①、查
>>> dict = {'aliez':23,'lisa':18,'may':22}
>>> dict['aliez']
23
②、增
>>> dict['john'] = 26
>>> dict['jan'] = 24
>>> dict
{'aliez': 23, 'lisa': 18, 'may': 22, 'john': 26, 'jan': 24}
③、改
>>> dict['aliez'] = 20
>>> dict['lisa'] = 23
>>> dict
{'aliez': 20, 'lisa': 23, 'may': 22, 'john': 26, 'jan': 24}
④、删
>>> dict.pop('aliez')
20
>>> dict
{'lisa': 23, 'may': 22, 'john': 26, 'jan': 24}

当然也可以用del

>>> del dict['lisa']
>>> dict
{'may': 22, 'john': 26, 'jan': 24}
dict.clear()      # 清空字典所有条目
del dict           # 删除字典

如果key不存在,就会报错

>>> dict['joan']
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'joan'

判断key是否存在有两种方法:
方法一: 通过in判断key是否存在

>>> 'joan' in dict
False

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

>>> dict.get('joan')
>>> dict.get('may')
22

tips:
和list比较,dict有以下几个特点:

  1. 查找和插入的速度极快,不会随着key的增加而变慢;
  2. 需要占用大量的内存,内存浪费多。

而list相反:

  1. 查找和插入的时间随着元素的增加而增加;
  2. 占用空间小,浪费内存很少。

所以,dict是用空间来换取时间的一种方法。

四、set

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

>>> s = set([1,3.14,520,'python'])
>>> s
{520, 1, 3.14, 'python'}

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

>>> s = set([1,3.14,520,'python',1,2,2,2,1])
>>> s
{1, 2, 3.14, 520, 'python'}

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

>>> s.add(4)
>>> s.add(5)
>>> s.add(4)
>>> s.add(4)
>>> s
{1, 2, 3.14, 4, 5, 520, 'python'}

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

>>> s.remove(1)
>>> s
{2, 3.14, 4, 5, 520, 'python'}

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

>>> s1 = set([1,2,3,4])
>>> s2 = set([2,3,5])
>>> s1 & s2
{2, 3}
>>> s1 | s2
{1, 2, 3, 4, 5}

set中不像元组那样可以放入可变对象:

>>> s1 = set([1,2,3,4,[2,4,5],7])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'

对于可变对象,比如list,对list进行操作,list内部的内容是会变化的,比如:

>>> a = ['c', 'b', 'a']
>>> a.sort()
>>> a
['a', 'b', 'c']

tips: sort()函数默认是升序reverse = Fasle,想要降序,秩序加入参数reverse = True

>>> a.sort(reverse = True)
>>> a
['c', 'b', 'a']

而对于不可变对象,比如str,对str进行操作:

>>> a = 'abc'
>>> b = a.replace('a', 'A')
>>> b
'Abc'
>>> a
'abc'

五、小练习

  1. 小明、小红、小刚是同班同学,且坐在同一排,分别坐在第一位、第二位、第三位。
    由于他们的身高都差不多,所以,老师计划让他们三个轮流坐在第一位。
    每次换座位的时候,第一位变第三位,后面两位都往前一位。
students = ['小明','小红','小刚']
for i in range(len(students)):
    student1 = students.pop(0)
    students.append(student1)
    print(students)

执行结果:

$ python3 sites.py
['小红', '小刚', '小明']
['小刚', '小明', '小红']
['小明', '小红', '小刚']
  1. 假设有两名囚徒A和B因为合伙犯罪被抓捕,因没有确凿可以指认罪行的证据,审判者准备单独审判两位囚徒。
    若两人都认罪,则两人各判10年;若一个认罪一个抵赖,则认罪的人判1年,抵赖的人判20年;若两人都抵赖,则各判3年。
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

# 需要呈现的结果:dict1 = {1:{A:认罪,B:不认罪},2:{A:不认罪,B:认罪}}


dict1 = {}
i = 0
while True:
    dict2 = {}
    a = input('A,你认罪吗?请回答认罪或者不认:')
    b = input('B,你认罪吗?请回答认罪或者不认:')
    i = i + 1
    dict2["囚犯A"] = a
    dict2["囚犯B"] = b
    dict1[i]= dict2
    del dict2
    if a == '认罪' and b == '认罪':
        print('两人都得判10年,唉')
    elif a == '不认罪' and b == '认罪':
        print('A判20年,B判1年,唉')
    elif a == '认罪' and b == '不认罪':
        print('A判1年,B判20年')
    else:
        print('都判3年,太棒了')
        break
print(dict1)

执行结果:

$ python3 dict.py
A,你认罪吗?请回答认罪或者不认:认罪
B,你认罪吗?请回答认罪或者不认:认罪
两人都得判10年,唉
A,你认罪吗?请回答认罪或者不认:认罪
B,你认罪吗?请回答认罪或者不认:不认罪
A判1年,B判20年
A,你认罪吗?请回答认罪或者不认:不认罪
B,你认罪吗?请回答认罪或者不认:认罪
A判20年,B判1年,唉
A,你认罪吗?请回答认罪或者不认:不认罪
B,你认罪吗?请回答认罪或者不认:不认罪
都判3年,太棒了
{1: {'囚犯A': '认罪', '囚犯B': '认罪'}, 2: {'囚犯A': '认罪', '囚犯B': '不认罪'}, 3: {'囚犯A': '不认罪', '囚犯B': '认罪'}, 4: {'囚犯A': '不认罪', '囚犯B': '不认罪'}}
京ICP备19055754号