最新消息:XAMPP默认安装之后是很不安全的,我们只需要点击左方菜单的 "安全"选项,按照向导操作即可完成安全设置。

Python基础:英雄联盟案例学习List

XAMPP案例 admin 628浏览 0评论

列表介绍

Python list(列表),是Python中最常用的一种数据结构,我们也称作列表类型。它是一组用方括号括起来、逗号分隔的数据。

数据可以是任意类型的,里面的数据也可以重复。虽然说可以任意类型,但是在开发的时候我们都是使用相同的类型。

格式是这样的:

list1 = [元素1、元素2、元素3、……]

如:heros = [‘孙膑’,’百里守约’,’墨子’]

dre00064

我们可以在编译器中定义一下并且查看数据类型的表示:

heros = ['孙膑', '百里守约', '墨子'] 
print(type(heros))

可以看到打印的结果是:<class ‘list’>,所以以后只要看到列表就是list。但是大家要注意元素与元素之间使用逗号隔开,逗号必须是英文输入法下的逗号哟!

比如让大家创建一个列表保存:探险家、河流之王、荒漠屠夫、齐天大圣、冰晶凤凰、赛恩,你如何定义呢?

heros = ['探险家','河流之王','荒漠屠夫','齐天大圣','冰晶凤凰','赛恩']
print(heros)

我们可以看到打印结果:

[‘探险家’, ‘河流之王’, ‘荒漠屠夫’, ‘齐天大圣’, ‘冰晶凤凰’, ‘赛恩’]

列表的索引与切片

索引

列表跟字符串一样,里面的元素就像一个个士兵站好的队伍一样,站队的时候他们都会报数。

从头到尾每个士兵都会报一个递增的数字,在我们列表这里也是如此的,报数的数字就是对应元素的索引(index),但是与我们生活中不同的是,列表第一元素的索引是0

比如:

heros = ['探险家','河流之王','荒漠屠夫','齐天大圣','冰晶凤凰','赛恩']
# 打印:荒漠屠夫,下标从0开始则荒漠屠夫就是2
print(heros[2])
# 打印:冰晶凤凰,对应的下标是4
print(heros[4])
# 打印:赛恩,对应的下标是5
print(heros[5])

打印结果:

荒漠屠夫

冰晶凤凰

赛恩

打印的内容就是我们想要的。

但是发现打印到【赛恩】的时候,我们数到那里太费劲了。

字符串中是支持负数下标的,列表是否支持?同样也是-1开始,并且是从右向左的。

可以使用heros[-1]打印一下。

事实上结果是完全没有问题的,索引的使用和字符串是一模一样的。即:

> 列表:  ['探险家','河流之王','荒漠屠夫','齐天大圣','冰晶凤凰','赛恩']
>       |       |          |        |          |       |
> 正索引:   0       1          2        3          4       5
> 负索引:   -6      -5        -4       -3          -2      -1
切片

通过索引,我们可以访问list(列表)的单个元素。但有时候我们要取列表的一个片段,这就是“切片”操作。切片返回的是一个列表,可以理解为“子列表”。

切片是通过索引来实现的,比如: heros[1:3],这里索引变成两个用冒号:分隔,分别是切片的开始索引和结束索引,[1:3]代表的是一个左闭右开的区间,即包含左边索引的元素,到右边索引为止但不包括该元素。那么heros[1:3]得到的是[‘河流之王’,’荒漠屠夫’]:

切片还有更加高级的用法就是控制步长和方向。格式:

列表名[start:end:step]

start和end是左闭右开的区间,step表示的是步长,并且步长可以是正向(从左向右)也可以是逆向(从右向左)取元素。

step如果是负数表示的是逆向,如果是正数表示的是正向

如果end省略则表示到列表最后一个元素,如果start省略表示从第一个元素开始

heros = ['探险家','河流之王','荒漠屠夫','齐天大圣','冰晶凤凰','赛恩']
# 打印:'河流之王','荒漠屠夫','齐天大圣'
print(heros[1:4])
# 打印:'河流之王','齐天大圣','赛恩',
print(heros[1::2])
# 打印:'赛恩','冰晶凤凰','齐天大圣'
print(heros[-1:2:-1])
# 打印: '冰晶凤凰','河流之王'
print(heros[-2::-3])

打印结果:

[‘河流之王’, ‘荒漠屠夫’, ‘齐天大圣’]

[‘河流之王’, ‘齐天大圣’, ‘赛恩’]

[‘赛恩’, ‘冰晶凤凰’, ‘齐天大圣’]

[‘冰晶凤凰’, ‘河流之王’]

如果想得到:’荒漠屠夫’和’赛恩’呢?怎么写?

list运算符与遍历

列表作为Python的一种“内置类型”,它也像基本类型数字、字符串那样可以进行一些运算符的运算,如下表所示:

运算符 含义 表达式 结果
+ 列表合并在一起 [1, 2, 3]+['a', 'b', 'c'] [1, 2, 3, 'a', 'b', 'c']
* 列表重复 ['a'] * 3 ['a', 'a', 'a']
in 是否为列表元素 'a' in ['a', 'b', 'c'] True

从头到尾遍历(迭代)一个list的语法是:for x in list

heros = ['探险家','河流之王','荒漠屠夫','齐天大圣','冰晶凤凰','赛恩']
for h in heros:
    print(h)

结果是列表中的元素换行打印出来。

如果想获取list列表的长度,也是使用len()这个内置函数。

heros = ['探险家','河流之王','荒漠屠夫','齐天大圣','冰晶凤凰','赛恩']
print(len(heros))  # 长度为6

list的常用操作

list列表中的元素还会经常涉及到变动,比如士兵站队,迟到的士兵默认要站在末尾,还有可能趁班长没有看到偷偷插队的士兵,甚至有内急偷偷离开的士兵。这跟我们列表元素中的增删改查很类似。

增加元素

比如我们有:heros = [‘探险家’,’河流之王’,’荒漠屠夫’,’齐天大圣’,’冰晶凤凰’,’赛恩’],又来了一位英雄:牛头酋长。我们怎么把他加进来呢?

在list中有:

list.append(obj): 在列表末尾添加新的对象

list.extend(seq): 在列表末尾一次性追加另一个序列中的多个值

heros = ['探险家','河流之王','荒漠屠夫','齐天大圣','冰晶凤凰','赛恩']
# 使用append添加元素
heros.append('牛头酋长')
print(heros)
# 有一个新的heros列表
new_heros=['希维尔','崔斯特']
# 将new_heros添加到heros中
heros.extend(new_heros)
print(heros)

打印结果是什么呢?

[‘探险家’, ‘河流之王’, ‘荒漠屠夫’, ‘齐天大圣’, ‘冰晶凤凰’, ‘赛恩’, ‘牛头酋长’]

[‘探险家’, ‘河流之王’, ‘荒漠屠夫’, ‘齐天大圣’, ‘冰晶凤凰’, ‘赛恩’, ‘牛头酋长’, ‘希维尔’, ‘崔斯特’]

删除元素

增加元素成功,但是我们如果又有想法想删除一个英雄人物呢?比如现在不喜欢:河流之王了,要将其删除掉。

删除的方式有多种:

  1. del list[索引] 表示 删除指定索引位置的元素
  2. list.pop([index=-1]) 移除列表中的一个元素(默认最后一个元素),并返回该元素的值,当然也可以索引值,表示 删除指定索引位置的元素跟del list[索引] 类似,但是这个pop有返回值,即被删除的元素
  3. list.remove(obj) 移除列表中某个值的第一个匹配项,没有返回值
heros = ['探险家','河流之王','荒漠屠夫','齐天大圣','冰晶凤凰','赛恩','冰晶凤凰']
# 删除下标为1的元素
del heros[1]
print(heros) 
# 删除下标为1的元素,并获取返回值
element = heros.pop(1)
print(heros) 
print(element)
# 删除:'冰晶凤凰'
element = heros.remove('冰晶凤凰')
print(heros)
print(element)
# 注意这句话会报错的,ValueError: list.remove(x): x not in list
element = heros.remove('冰晶凤凰1')
print(heros)

结果:

[‘探险家’, ‘荒漠屠夫’, ‘齐天大圣’, ‘冰晶凤凰’, ‘赛恩’,’冰晶凤凰’]

[‘探险家’, ‘齐天大圣’, ‘冰晶凤凰’, ‘赛恩’,’冰晶凤凰’]

荒漠屠夫

[‘探险家’, ‘齐天大圣’, ‘赛恩’,’冰晶凤凰’]

None

可以看到remove的返回值是None,而且是只删除了从左向右的第一个遇到的元素,后面的没有删除。而且如果要删除的元素不在列表中存在则会报异常:ValueError。

修改元素

所谓修改元素就是修改指定位置的元素。比如heros[0]是探险家,现在想换成其他的英雄。

方式有两种:

  1. 直接使用list[索引]进行替换
  2. 使用insert(‘元素名’)

我们通过代码观察一下区别:

heros = ['探险家','河流之王','荒漠屠夫','齐天大圣','冰晶凤凰','赛恩']
# 使用列表方式替换原有元素
heros[0]='希维尔'
print(heros)

heros[-1]='牛头酋长'
print(heros)
# 使用insert指定索引位置替换
heros.insert(3,'崔斯特')
print(heros)

结果如下:

[‘希维尔’, ‘河流之王’, ‘荒漠屠夫’, ‘齐天大圣’, ‘冰晶凤凰’, ‘赛恩’]

[‘希维尔’, ‘河流之王’, ‘荒漠屠夫’, ‘齐天大圣’, ‘冰晶凤凰’, ‘牛头酋长’]

[‘希维尔’, ‘河流之王’, ‘荒漠屠夫’, ‘崔斯特’, ‘齐天大圣’, ‘冰晶凤凰’, ‘牛头酋长’]

通过结果我们分析出,heros[0]=’希维尔’是替换了原来的元素:探险家,而heros.insert(3,’崔斯特’)则是【崔斯特】占用了索引3的位置,原来此位置的【齐天大圣】被挤到后面了。

查询元素

所谓查询元素,就是判断列表中是否存在要查找的元素。那我们使用什么完成这个任务呢?严格来说是三种方式:

  1. list.index(obj) 从列表中找出某个值第一个匹配项的索引位置
  2. list.count(obj) 统计某个元素在列表中出现的次数
  3. obj in list 其实这个在前面说过,但是也可以用于判断

我们通过代码来看一下

heros = ['探险家','河流之王','冰晶凤凰','荒漠屠夫','齐天大圣','冰晶凤凰','赛恩','冰晶凤凰']
# 判断'荒漠屠夫'是否在列表中存在
n = heros.index('荒漠屠夫')
print(n)

# 判断'牛头酋长'是否在列表中存在
# n = heros.index('牛头酋长')
# print(n)

# 也可以使用count判断个数
n = heros.count('冰晶凤凰')
print(n)

# 当然也可以使用:'荒漠屠夫' in heros
print('荒漠屠夫' in heros)

运行结果看一下(注意把查找’牛头酋长’的注释掉了,为什么要注释呢?)

3

3

True

注释的原因是:如果查找的元素不在列表中,会报错的,ValueError: ‘牛头酋长’ is not in list。

其他操作

列表除了这些操作之外还有排序、倒序等方法可以使用。

list.reverse() 反向列表中的元素

list.sort(cmp=None, key=None,reverse=False) 对原列表进行排序

代码展示一下:

heros = ['探险家','河流之王','冰晶凤凰','荒漠屠夫','齐天大圣','冰晶凤凰','赛恩','冰晶凤凰']
# 倒序列表中的元素
heros.reverse()
print(heros)

# 对列表中的元素进行排序
heros.sort()
print(heros)

# 对列表中的元素进行排序,也可以降序
heros.sort(reverse=True)
print(heros)

结果:

[‘冰晶凤凰’, ‘赛恩’, ‘冰晶凤凰’, ‘齐天大圣’, ‘荒漠屠夫’, ‘冰晶凤凰’, ‘河流之王’, ‘探险家’]

[‘冰晶凤凰’, ‘冰晶凤凰’, ‘冰晶凤凰’, ‘探险家’, ‘河流之王’, ‘荒漠屠夫’, ‘赛恩’, ‘齐天大圣’]

[‘齐天大圣’, ‘赛恩’, ‘荒漠屠夫’, ‘河流之王’, ‘探险家’, ‘冰晶凤凰’, ‘冰晶凤凰’, ‘冰晶凤凰’]

怎么样?有了列表的操作之后,我们在操作一组数据的时候是不是变得很方便了。

转载请注明:XAMPP中文组官网 » Python基础:英雄联盟案例学习List

您必须 登录 才能发表评论!