写给小白的Python之006:数据类型之列表

导读:

1.列表

2.列表的方法

3.列表的遍历

4.列表当栈和队列

5.列表推导式

6.列表嵌套

7.del语句

 

一、列表

list(列表) 是Python中使用最频繁的数据类型,在其他语言中通常叫做 数组。列表是写在方括号之间、用逗号分隔开的元素列表。索引从0开始。

列表的格式为:[元素1,元素2,元素3…]

注意:从列表中取值时,如果 超出索引范围,程序会报错。

列表中元素的类型可以不相同:

>>> a = ['him', 25, 100, 'her']
>>> print(a)
['him', 25, 100, 'her']

和字符串一样,列表同样可以被索引和切片,列表被切片后返回一个包含所需元素的新列表。

列表还支持串联操作,使用+操作符

>>> a = [1, 2, 3, 4, 5]
>>> a + [6, 7, 8]
[1, 2, 3, 4, 5, 6, 7, 8]

与Python字符串不一样的是,列表中的元素是可以改变的

>>> a = [1, 2, 3, 4, 5, 6]
>>> a[0] = 9
>>> a[2:5] = [13, 14, 15]
>>> a
[9, 2, 13, 14, 15, 6]

>>> a[2:5] = [] # 删除
>>> a
[9, 2, 6]

尽管 Python 的 列表 中可以 存储不同类型的数据,但是在开发中,更多的应用场景是:
1.列表 存储相同类型的数据;
2.通过 迭代遍历,在循环体内部,针对列表中的每一项元素,执行相同的操作。

要点:

1、list写在方括号之间,元素用逗号隔开。

2、和字符串一样,list可以被索引和切片。

3、list可以使用+操作符进行拼接。

4、list中的元素是可以改变的。

 

 

二、列表的方法

分类

关键字 / 函数 / 方法

说明

增加

列表.insert(索引, 数据)

在指定位置插入数据

 

列表.append(数据)

在末尾追加数据

 

列表.extend(列表2)

将列表2 的数据追加到列表

修改

列表[索引] = 数据

修改指定索引的数据

删除

del 列表[索引]

删除指定索引的数据

 

列表.remove[数据]

删除第一个出现的指定数据

 

列表.pop

删除末尾数据

 

列表.pop(索引)

删除指定索引数据

 

列表.clear

清空列表

统计

len(列表)

列表长度

 

列表.count(数据)

数据在列表中出现的次数

排序

列表.sort()

升序排序

 

列表.sort(reverse=True)

降序排序

 

列表.reverse()

逆序、反转

list.append(x)

在列表的尾部添加一个项,等价于 a[len(a):] = [x] 。

demo:

#定义变量A,默认有3个元素
A = ['xiaoWang','xiaoZhang','xiaoHua']
print("-----添加之前,列表A的数据-----")

for tempName in A:
    print(tempName)

#提示、并添加元素
temp = input('请输入要添加的学生姓名:')
A.append(temp)

print("-----添加之后,列表A的数据-----")
for tempName in A:
    print(tempName) 

结果:

-----添加之前,列表A的数据-----
xiaoWang
xiaoZhang
xiaoHua
请输入要添加的学生姓名:salmond
-----添加之后,列表A的数据-----
xiaoWang
xiaoZhang
xiaoHua
salmond

 

list.extend(L)

将给定的列表L接到当前列表后面,等价于 a[len(a):] = L 。

>>> a = [1, 2]
>>> b = [3, 4]

>>> a.append(b)
>>> a
[1, 2, [3, 4]]

>>> a.extend(b)
>>> a
[1, 2, [3, 4], 3, 4]

list.insert(i, x)

在给定的位置 i 前插入项,例如:a.insert(0, x) 会在列表的头部插入,而 a.insert(len(a), x) 则等价于a.append(x)。

>>> a = [0, 1, 2]
>>> a.insert(1, 3)
>>> a
[0, 3, 1, 2]

 

list.remove(x)

移除列表中第一个值为 x 的项,没有的话会产生一个错误。

movieName = ['加勒比海盗','骇客帝国','第一滴血','指环王','霍比特人','速度与激情']

print('------删除之前------')
for tempName in movieName:
    print(tempName)

movieName.remove('指环王')

print('------删除之后------')
for tempName in movieName:
    print(tempName)

结果:

------删除之前 - -----
加勒比海盗
骇客帝国
第一滴血
指环王
霍比特人
速度与激情
------删除之后 - -----
加勒比海盗
骇客帝国
第一滴血
霍比特人
速度与激情

list.pop([i])

删除列表给定位置的项,并返回它。如果没有指定索引, a.pop() 移除并返回列表的最后一项。(方括号表示可选)。

movieName = ['加勒比海盗','骇客帝国','第一滴血','指环王','霍比特人','速度与激情']

print('------删除之前------')
for tempName in movieName:
    print(tempName)

movieName.pop()

print('------删除之后------')
for tempName in movieName:
    print(tempName)

结果:

------删除之前 - -----
加勒比海盗
骇客帝国
第一滴血
指环王
霍比特人
速度与激情
------删除之后 - -----
加勒比海盗
骇客帝国
第一滴血
指环王
霍比特人

list.clear()

删除列表中的所有项 。

movieName = ['加勒比海盗','骇客帝国','第一滴血','指环王','霍比特人','速度与激情']

print('------删除之前------')
for tempName in movieName:
    print(tempName)

movieName.clear()

print('------删除之后------')
for tempName in movieName:
    print(tempName)

结果:

------删除之前 - -----
加勒比海盗
骇客帝国
第一滴血
指环王
霍比特人
速度与激情
------删除之后 - -----

 

list.index(x,start,end)

返回列表中第一个值为 x 的项的索引。如果没有匹配的项, 则产生一个错误。左闭右开

list.count(x)

返回列表中 x 出现的次数。

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

>>> a.index('a', 1, 3) # 注意是左闭右开区间
Traceback (most recent call last):

  File "<stdin>", line 1, in <module>

ValueError: 'a' is not in list

>>> a.index('a', 1, 4)
3

>>> a.count('b')
2

>>> a.count('d')
0

 

list.sort()

就地完成列表排序(升序)。

list.sort(reverse=True)

就地完成列表排序(降序)。

list.reverse()

就地完成列表项的翻转。

>>> a = [1, 4, 2, 3]

>>> a.reverse()
>>> a
[3, 2, 4, 1]

>>> a.sort()
>>> a
[1, 2, 3, 4]

>>> a.sort(reverse=True)
>>> a
[4, 3, 2, 1]

 

 三、列表的遍历

遍历 就是 从头到尾 依次 列表 中获取数据;在 循环体内部 针对 每一个元素,执行相同的操作。

Python 中为了提高列表的遍历效率,专门提供的 迭代 iteration 遍历。

使用 for 就能够实现迭代遍历:

# for 循环内部使用的变量 in 列表

for name in name_list:

    循环内部针对列表元素进行操作

    print(name)

demo:

namesList = ['xiaoWang', 'xiaoZhang', 'xiaoHua']

for name in namesList:
    print(name)

结果:

    xiaoWang

    xiaoZhang

    xiaoHua

demo:

namesList = ['xiaoWang', 'xiaoZhang', 'xiaoHua']

length = len(namesList)

i = 0
while i < length:
    print(namesList[i])
    i += 1

结果:

    xiaoWang

    xiaoZhang

    xiaoHua

带下标的遍历

1种方法:

chars = ['a', 'b', 'c', 'd']

i = 0
for chr in chars:
    print("%d %s"%(i, chr))
    i += 1

结果:

0 a

1 b

2 c

3 d

2种方法:enumerate()

enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。

chars = ['a', 'b', 'c', 'd']

for i, chr in enumerate(chars):
    print (i, chr)

结果:同上

 

 四、列表当栈和队列

1. 列表当栈

list的方法使得其可以很方便地作为一个栈来使用。我们知道,栈的特点是最后进入的元素最先出来(即后入先出),用 append() 方法进行压栈,用不指定索引的 pop() 方法进行出栈。

示例:

stack = []

for x in range(1,6):

    stack.append(x) # 入栈

    print('push', x, end=' ')

    print(stack)

print('Now stack is', stack)

while len(stack)>0:

    print('pop', stack.pop(), end=' ') # 出栈

    print(stack)

2. 列表当队列

列表还可以当作队列来使用,队列的特性是第一个加入的元素第一个取出来(即先入先出)。然而,把列表当队列使用效率并不高,因为从列表的尾部添加和弹出元素是很快的,而在列表的开头插入或弹出是比较慢的(因为所有元素都得移动一个位置)。

要实现一个队列, 使用标准库的collections.deque, 它被设计成在两端添加和弹出都很快。示例:

from collections import deque

queue = deque() # 创建空队列

for x in range(1,6):
    queue.append(x) # 入队
    print('push', x, end=' ')
    print(list(queue))

print('Now queue is', list(queue))

while len(queue)>0:
    print('pop', queue.popleft(), end=' ') # 出队
    print(list(queue))

 

五、列表推导式

所谓的列表推导式,就是指的轻量级循环创建列表。列表推导式提供了从序列创建列表的简单途径。通常程序会对序列的每一个元素做些操作,并以其结果作为新列表的元素,或者根据指定的条件来创建子序列。
列表推导式的结构是:在一个方括号里,首先是一个表达式,随后是一个 for 子句,然后是零个或更多的 for 或 if 子句。返回结果是一个根据表达从其后的 for 和 if 上下文环境中生成出来的列表。
示例:

squares = [x**2 for x in range(10)] # 推导式
print(squares)

# 输出是[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

pairs = [(x, y) for x in [1,2,3] for y in [3,1,4] if x!=y] # 推导式
print(pairs)

# 输出是[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]

列表生成式也可以使用两个变量来生成 list:

>>> d = {'x': 'A', 'y': 'B', 'z': 'C' }
>>> [k + '=' + v for k, v in d.items()]
['y=B', 'x=A', 'z=C']

把一个 list 中所有的字符串变成小写:

>>> L = ['Hello', 'World', 'IBM', 'Apple']
>>> [s.lower() for s in L]
['hello', 'world', 'ibm', 'apple']

案例:
修改列表生成式,通过添加 if 语句保证列表生成式能正确地执行:

L1 = ['Hello', 'World', 18, 'Apple', None]
L2 = [i for i in L1 if isinstance(i, str)]
print(L2)

# 输出: ['hello', 'world', 'apple']

六、列表嵌套

Python中并没有二维数组的概念,但我们可以通过列表嵌套达到同样的目的。

mat = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
]

同样,我们可以使用推导式生成嵌套的列表:

mat = [[1,2,3], [4,5,6], [7,8,9]]
new_mat = [ [row[i] for row in mat] for i in [0,1,2] ] # 嵌套
print(new_mat) # [[1, 4, 7], [2, 5, 8], [3, 6, 9]]

 

 七、附:del语句

del 语句可以通过给定索引(而不是值)来删除列表中的项,它与返回一个值的pop()方法不同。del语句也可以移除列表中的切片,或者清除整个列表 :

lst = [1,2,3,4,5,6,7,8,9]

del lst[2] # 删除指定索引项

print(lst) # [1,2,4,5,6,7,8,9]

del lst[2:5] # 删除切片

print(lst) # [1,2,7,8,9]

del lst[:] # 删除整个列表

print(lst)

# 在日常开发中,要从列表删除数据,建议 使用列表提供的方法。 

del关键字本质上是用来将一个变量从内存中删除的。在删除变量实体之后再引用该变量的话会产生错误。

del用于删除变量实体:

del lst

 

八、练习题:列表

从今天起,每篇的练习题都会在本篇中给出。希望各位看官,先把练习题做一遍,再看答案。

练习1:
请写出一段 Python 代码实现分组一个 list 里面的元素,比如 [1,2,3,...100]变成 [[1,2,3],[4,5,6]....]

练习题2:工位随机分配

一个学校,有3个办公室,现在有8位老师等待工位的分配,请编写程序,完成随机的分配。

 

 

------------------以下为答案----------------以下为答案----------------以下为答案----------------

练习题1参考答案:

a = [x for x in range(1,101)]
b = [a[x:x+3] for x in range(0,len(a),3)]

练习题2参考答案:

#encoding=utf-8

import random

# 定义一个列表用来保存3个办公室
offices = [[],[],[]]

 # 定义一个列表用来存储8位老师的名字
names = ['A','B','C','D','E','F','G','H']

i = 0
for name in names:
    index = random.randint(0,2)    
    offices[index].append(name)
 
i = 1
for tempNames in offices:
    print('办公室%d的人数为:%d'%(i,len(tempNames)))
    i+=1

    for name in tempNames:
        print("%s"%name,end='')

    print("\n")
    print("-"*20)

运行结果如下:(结果是随机的)

办公室1的人数为:1
C

--------------------
办公室2的人数为:3
ADG

--------------------
办公室3的人数为:4
BEFH

--------------------

 

写给小白的Python之005:语句练习题答案

1. 使用if,编写程序,实现以下功能

_ 从键盘获取用户名、密码

_ 如果用户名和密码都正确(预先设定一个用户名和密码),那么就显示“欢迎进入xxx的世界”,否则提示密码或者用户名错误

username=input('请输入用户名:')
password=input('请输入密码:')
if username=='ma' and password=='1234':
    print('欢迎进入%s的世界'%username)
elif username=='ma' and password!='1234':
    print('密码错误')
elif username!='ma' and password=='1234':
    print('用户名错误')
else:
    print('用户名和密码错误')

 

2.BMI 计算

输入一个人的身高(m)和体重(kg),根据BMI公式(体重除以身高的平方)计算他的BMI指数。

* 例如:一個52公斤的人,身高是155cm,则BMI为 :`52(kg)/1.55^2(m)= 21.6`

* BMI指数:
```
低于18.5:过轻
18.5-25:正常
25-28:过重
28-32:肥胖
高于32:严重肥胖
```

# 获取数据
height = float(input("请输入您的身高(m)"))
weight = int(input("请输入您的体重(kg):"))

# 计算 BMI 指数值
bmi = weight / (height ** 2)
print("您的 BMI 指数为: %f" % bmi)

# 判断
if bmi <= 18.5:
    print("过轻")
elif bmi < 15:
    print("正常")
elif bmi < 28:
    print("过重")
elif bmi < 32:
    print("肥胖")
else:
    print("严重肥胖")

3.个人所得税

编写一个程序计算个人所得税(以下为个人所得税税率表,3500元起征):
```
应纳税所得额(含税) 税率(%)
不超过1500元的 3
超过1500元至4,500元的部分 10
超过4,500元至9,000元的部分 20
超过9,000元至35,000元的部分 25
超过35,000元至55,000元的部分 30
超过55,000元至80,000元的部分 35
超过80,000元的部分 45
```

income = float(input("请输入你的收入:"))
START = 3500
a = income - START
if a > 0:
    if a <= 1500:
        tax = a * 0.03
    elif a <= 4500:
        tax = (a-1500) * 0.1 + 1500 * 0.03
    elif a <= 9000:
        tax = (a-4500) * 0.2 + 3000 * 0.1 + 1500 * 0.03
    elif a <= 35000:
        tax = (a-9000) * 0.25 + 4500 * 0.2 + 3000 * 0.1 + 1500 * 0.03
    elif a <= 55000:
        tax = (a-35000) * 0.3 + (35000 - 9000) * 0.25 + 4500 * 0.2 + 3000 * 0.1 + 1500 * 0.03
    elif a <= 80000:
        tax = (a-55000) * 0.35 + (55000 - 35000) * 0.3 + (35000 - 9000) * 0.25 + 4500 * 0.2 + 3000 * 0.1 + 1500 * 0.03
    else:
        tax = (a-80000) * 0.45 +(80000 - 55000) * 0.35 + (55000 - 35000) * 0.3 + (35000 - 9000) * 0.25 + 4500 * 0.2 + \
              3000 * 0.1 + 1500 * 0.03
    print("你的收入为:%.02f,个人所得税为:%.02f" % (income, tax))
else:
    print("穷逼")

结果:

请输入你的收入:25000
你的收入为:25000.00,个人所得税为:4370.00

 

 

转载于:https://www.cnblogs.com/salmond/p/8722268.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值