当前位置:   article > 正文

Python列表操作小技巧——索引、切片、增添、删除、修改和其他用法_列表索引

列表索引

关于列表,需要对其说明如下三点:

  • 列表的构造是通过英文状态下的方括号完成的,即[]。可以将每一个元素存放在中括号中,而且列表中的元素是不受任何限制的,可以存放数值、字符串及其他数据结构的内容。
  • 列表是一种序列,即每个列表元素是按照顺序存入的,这些元素都有一个属于自己的位置(或下标)。
  • 列表是一种可变类型的数据结构,即可以实现对列表的修改,包括增加、删除和修改列表中的元素值。

一、列表的索引

“列表是一种序列”指的是可以通过索引(或下标)的方式实现列表元素的获取,Python中的索引都是用英文状态下的方括号表示,而且,对于位置索引来说,都是从0开始。接下来通过具体的例子来解释四种常见的索引方式。

1.1 正向索引

正向单索引指的是只获取列表中的某一个元素,并且是从左到右的方向数元素所在的位置,可以用[n]表示,例如:

list1 = ['张三','男',33,'江苏','硕士','已婚',['身高178','体重72']]
# 取出第一个元素
print(list1[0])
# 取出第四个元素
print(list1[3])
# 取出最后一个元素
print(list1[6])
# 取出“体重72”这个值
print(list1[6][1])
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

结果:

张三
江苏
['身高178', '体重72']
体重72
  • 1
  • 2
  • 3
  • 4

如上结果显示,变量list1是一个含有7个元素的列表,包含字符串(注意,字符串必须用引号引起来)、数值和列表。由于位置索引是从0开始,所以索引号与实际的位置正好差1,最后使用print函数将取回的元素打印出来。
列表中最后一个元素正好又是一个列表(一般称为嵌套列表),所以要取出嵌套列表中的元素就需要两层索引实现。

1.2 负向单索引

负向单索引是指在正向单索引的基础上添加一个负号“-”,所表达的含义是从右向左的方向获取元素,可以用[-n]表示,例如:

list1 = ['张三','男',33,'江苏','硕士','已婚',['身高178','体重72']]
# 取出最后一个元素
print(list1[-1])
# 取出“身高178”这个值
print(list1[-1][0])
# 取出倒数第三个元素
print(list1[-3])
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

结果:

['身高178', '体重72']
身高178
硕士
  • 1
  • 2
  • 3

如果列表元素特别多,而需要获取的数据恰好又是最后几个,那么负向单索引就显得尤为方便和简单,否则从头开始数下去,就显得非常麻烦。注意,最后一个列表元素可以用[-1]表示,千万不要写成[-0],这是初学者容易犯错的地方。

1.3特殊值索引

使用**index()**进行特殊值索引。

L = [2,4,5,6,2,6,0,4]
print(L.index(2))
  • 1
  • 2

结果:

0
  • 1

但是Index()只会标注出首次出现特殊值的位置。如果特殊值有多个怎么办?
使用enumerate函数,它不仅可以直接列出位置,还可以列出值

L = [2, 4, 5, 6, 2, 6, 0, 4]
for i, j in enumerate(L):
    if j == 2:
        print(i,j)
  • 1
  • 2
  • 3
  • 4

结果:

0 2
4 2
  • 1
  • 2

二、列表的切片

2.1 切片索引

切片索引指的是按照固定的步长,连续取出多个元素,可以用**[start : end : step]**表示。start指索取元素的起始位置;end指索取元素的终止位置(注意,end位置的元素是取不到的!);step指索取元素的步长,默认为1,表示逐个取出一连串的列表元素;切片,你可以把它理解成高中所学的值域范围,属于左闭右开[ , )的效果。例如:

list2 = ['江苏','安徽','浙江','上海','山东','山西','湖南','湖北']
#取出”浙江“至”山西“四个元素
print(list2[2:6])
#取出“安徽”、“上海”、“山西”三个元素
print(list2[1:6:2])
#取出倒数第二个和第三个元素
print(list2[-3:-1])
#取出最后三个元素
print(list2[-3:])
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

结果:

['浙江', '上海', '山东', '山西']
['安徽', '上海', '山西']
['山西', '湖南']
['山西', '湖南', '湖北']
  • 1
  • 2
  • 3
  • 4

2.2 无限索引

无限索引是指在切片过程中不限定起始元素的位置或终止元素的位置,甚至起始和终止元素的位置都不限定,可以用[ ::step]表示。第一个冒号是指从列表的第一个元素开始获取;第二个冒号是指到最后一个元素结束(包含最后一个元素值)。例如:

list2 = ['江苏','安徽','浙江','上海','山东','山西','湖南','湖北']
# 取出头三个元素
print(list2[:3])
# 取出最后三个元素
print(list2[-3:])
# 取出所有元素
print(list2[::])
# 取出奇数位置的元素
print(list2[::2])
# 取出偶数位置的元素
print(list2[1::2])
# 取出所有元素并倒序打印出来
print(list2[::-1])
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

结果:

['江苏', '安徽', '浙江']
['山西', '湖南', '湖北']
['江苏', '安徽', '浙江', '上海', '山东', '山西', '湖南', '湖北']
['江苏', '浙江', '山东', '湖南']
['安徽', '上海', '山西', '湖北']
['湖北', '湖南', '山西', '山东', '上海', '浙江', '安徽', '江苏']
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

如上结果显示,如果需要从头开始返回元素,可以将切片中的start设置为冒号(:);如果需要返回至结尾的元素,可以将切片中的end设置为冒号;当然,start和end都设置为冒号的话,返回的是整个列表元素(等同于复制的功效),再通过step控制步长,实现有规律地跳格取数。

三、列表元素的增添

“列表是可变类型的数据结构”指的是可以通过列表特有的“方法”,实现列表元素的增加、删除和修改,一旦通过这些方法完成列表的改操作,列表本身就发生变化了。注意,这里说的是特有的“方法”,而不是函数。
如果需要往列表中增加元素,可使用Python提供的三种方法,即appendextend+insert。下面通过例子来解释三者的区别:

3.1 append

append是列表所特有的方法,其他常见对象是没有这个方法的,该方法是往列表的尾部增加元素,而且每次只能增加一个元素
如果需要一次增加多个元素,该方法无法实现,只能使用列表的extend方法。
例如:

list3 = [1,10,100,1000,10000]
# 在列表末尾添加数字2
list3.append(2)
print(list3)
#在例表末尾添加一个新列表[1,2,3]
list3.append([1,2,3])
print(list3)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

结果:

[1, 10, 100, 1000, 10000, 2]
[1, 10, 100, 1000, 10000, 2, [1, 2, 3]]
  • 1
  • 2

3.2 extend

使用extend方法往列表尾部增加多个元素时,一定要将多个元素捆绑为列表传递给该方法,即使只有一个元素,也需要以列表的形式传递
extend也可以起到合并列表的功能

list3 = [1,10,100,1000,10000]
# 在列表末尾添加20,200,2000,20000四个值
list3.extend([20,200,2000,20000])
print(list3)
  • 1
  • 2
  • 3
  • 4

结果:

[1, 10, 100, 1000, 10000, 20, 200, 2000, 20000]
  • 1

3.3 加号(+)

加号+,也能起到类似extend的作用,可以合并两个列表。所以一定要将多个元素捆绑为列表传递给该方法,即使只有一个元素,也需要以列表的形式传递
例如

list3 = [1,10,100,1000,10000]
# 在列表末尾添加20,200,2000,20000四个值
list4 = [20,200,2000,20000]
list = list3 + list4
print(list)
  • 1
  • 2
  • 3
  • 4
  • 5

结果:

[1, 10, 100, 1000, 10000, 20, 200, 2000, 20000]
  • 1

3.4 insert

insert方法可以在列表的指定位置插入新值,该方法需要传递两个参数:

  • 一个是索引(或下标)参数,如下面例子的2,是指在列表元素的第三个位置插入;
  • 另一个参数是具体插入的值,既可以是一个常量,也可以是一个列表,如果是列表,就是以嵌套列表的形式插入。

例如:

list3 = [1,10,100,1000,10000]
# 在数字10后面增加11这个数字
list3.insert(2,11)  #2是位置索引,表明要插入的位置;11是你要的数值
print(list3)
# 在10000后面插入['a','b','c']
list3.insert(3,['a','b','c'])  #3是位置索引,表明要插入的位置;['a','b','c']是你要插入的列表
print(list3)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

结果:

[1, 10, 11, 100, 1000, 10000]
[1, 10, 11, ['a', 'b', 'c'], 100, 1000, 10000]
  • 1
  • 2

insert的缺点,它会改变与之相关联的列表

list3 = [1,10,100,1000,10000]
list4 = list3
# 在数字10后面增加11这个数字
list4.insert(2,11)  #2是位置索引,表明要插入的位置;11是你要的数值
print(list3)
print(list4)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

结果:

[1, 10, 11, 100, 1000, 10000]
[1, 10, 11, 100, 1000, 10000]
  • 1
  • 2

四、列表元素的删除

能往列表中增加元素,就能从列表中删除元素。关于列表元素的删除有三种方法,分别是popremoveclear,下面举例说明。

4.1 pop

通过pop方法,可以完成列表元素两种风格的删除:

  • 一种是默认删除列表的末尾元素;
  • 另一种是删除指定位置的列表元素,

而且都只能删除一个元素
例如:

list3 = [1,10,100,1000,10000]
# 删除list3中10000这个元素
list3.pop()  #默认删除列表的末尾元素
print(list3)
# 删除list3中100这个元素
list3.pop(2)  #删除第三个数字
print(list3)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

结果:

[1, 10, 100, 1000]
[1, 10, 1000]
  • 1
  • 2

4.2 remove

remove方法提供了删除指定值的功能,该功能非常棒,但是它只能删除首次出现的指定值。如果你的列表元素特别多,通过pop方法删除指定位置的元素就显得非常笨拙,因为你需要数出删除值的具体位置,而使用remove方法就很方便。
例如:

list3 = [1,10,100,1000,10000]
# 删除list3中100这个元素
list3.remove(100)
print(list3)
list4 = [1, 10, 11, 11, 100, 1000, ['a', 'b', 'c'], 10000, ['a', 'b', 'c'], 2, 20, 200, 2000]
#删除list4中的11这个元素
list4.remove(11)
print(list4)
#删除list4中的['a', 'b', 'c']
list4.remove(['a', 'b', 'c'])
print(list4)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

结果:

[1, 10, 1000, 10000]
[1, 10, 11, 100, 1000, ['a', 'b', 'c'], 10000, ['a', 'b', 'c'], 2, 20, 200, 2000]
[1, 10, 11, 100, 1000, 10000, ['a', 'b', 'c'], 2, 20, 200, 2000]
  • 1
  • 2
  • 3

4.3 clear

clear从字面理解就是清空的意思,确实,该方法就是将列表中的所有元素全部删除。如上结果所示,通过clear方法返回的是一个空列表。
例如:

list3 = [1,10,100,1000,10000]
# 删除list3中所有元素
list3.clear()
print(list3)
  • 1
  • 2
  • 3
  • 4

结果:

[]
  • 1

五、列表元素的修改

如果列表元素值存在错误该如何修改呢?
不幸的是对于列表来说,没有具体的方法可言,但可以使用“取而改之”的思想实现元素的修改。“取而改之”是指先通过错误元素的获取(通过索引的方法),再使用正确的值重新替换即可。正如下面的结果所示,就是用新值替换旧值,完成列表元素的修改。
下面通过具体的例子来加以说明:

list4 = ['洗衣机','冰响','电视机','电脑','空调']
# 将“冰响”修改为“冰箱”
print(list4[1])
list4[1] = '冰箱'
print(list4)
  • 1
  • 2
  • 3
  • 4
  • 5

结果:

冰响
['洗衣机', '冰箱', '电视机', '电脑', '空调']
  • 1
  • 2

六、列表的其他操作技巧

除了上面介绍的列表元素增加和删除所涉及的“方法”外,还有其他“方法”,
排序、计数、查询位置、逆转

  • sort方法可以实现列表元素的排序默认是升序,可以将reverse参数设置为True,进而调整为降序。需要注意的是,sort方法只能对同质数据进行排序,即列表元素统一都是数值型或字符型,不可以混合多种数据类型或数据结构。
  • count方法是用来对列表中的某个元素进行计数,每次只能往count方法中传递一个值;
  • index方法则返回指定值在列表中的位置,遗憾的是只返回首次出现该值的位置;
  • reverse方法是将列表元素全部翻转,最后一个元素重新排到第一个位置,倒数第二个元素排到第二个位置,以此类推;

接下来仍然通过具体的例子来说明它们的用法:

list5 = [7,3,9,11,4,6,10,3,7,4,4,3,6,3]
# 列表元素的降序
list5.sort(reverse=True)
print(list5)
# 计算列表中元素3的个数
print(list5.count(3))
# 找出元素6所在的位置
print(list5.index(6))
# 列表元素的颠倒
list5.reverse()
print(list5)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

结果:

[11, 10, 9, 7, 7, 6, 6, 4, 4, 4, 3, 3, 3, 3]
4
5
[3, 3, 3, 3, 4, 4, 4, 6, 6, 7, 7, 9, 10, 11]
  • 1
  • 2
  • 3
  • 4

1、copy函数
使用上述函数,会使得赋值列表也发生改变
比如:

list1 = [2,4,1,2,7,8,4]

list2 = list1
print(list2)
list1.sort()
print(list1)
print(list2)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

结果:

[2, 4, 1, 2, 7, 8, 4]
[1, 2, 2, 4, 4, 7, 8]
[1, 2, 2, 4, 4, 7, 8]
  • 1
  • 2
  • 3

可以使用copy函数解决这个问题

list1 = [2,4,1,2,7,8,4]

list2 = list1.copy()
print(list2)
list1.sort()
print(list1)
print(list2)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

结果:

[2, 4, 1, 2, 7, 8, 4]
[1, 2, 2, 4, 4, 7, 8]
[2, 4, 1, 2, 7, 8, 4]
  • 1
  • 2
  • 3

七、在一个for循环中同时遍历两个列表

list1 = ['a', 'b', 'c', 'd']
list2 = ['apple', 'boy', 'cat', 'dog']
for x, y in zip(list1, list2):
    print(x, 'is', y)
  • 1
  • 2
  • 3
  • 4

结果:

a is apple
b is boy
c is cat
d is dog
  • 1
  • 2
  • 3
  • 4

八、列表去重

1、set(去重之后会改变顺序)

ids = [1,4,3,3,4,2,3,4,5,6,1]
ids = list(set(ids))
print(ids)
  • 1
  • 2
  • 3

结果:

[1, 2, 3, 4, 5, 6]
  • 1
ids = ['H', 'H', 'B', 'H', 'H', 'D', 'F', 'F', 'F', 'D', 'C']
ids = list(set(ids))
print(ids)
  • 1
  • 2
  • 3

结果:

['D', 'F', 'C', 'H', 'B']
  • 1

2、循环

ids = ['H', 'H', 'B', 'H', 'H', 'D', 'F', 'F', 'F', 'D', 'C']
news_ids = []
for id in ids:
    if id not in news_ids:
        news_ids.append(id)
print(news_ids)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

结果:

['H', 'B', 'D', 'F', 'C']
  • 1

改变顺序:

ids = ['H', 'H', 'H', 'H', 'H', 'D', 'F', 'F', 'F', 'D', 'E', 'E', 'D', 'D', 'D', 'F', 'F', 'H', 'B', 'B', 'B', 'C', 'D', 'D', 'I', 'F', 'I', 'F', 'D', 'I', 'F', 'F', 'D', 'F', 'F', 'H', 'F', 'F', 'F', 'F', 'D', 'F', 'D', 'D', 'D', 'K', 'K', 'D', 'I', 'I', 'I', 'D', 'H', 'D', 'D', 'D', 'D', 'D', 'D', 'D', 'D', 'D', 'D', 'F', 'K', 'D', 'D', 'D', 'D', 'D', 'D', 'D', 'D', 'D', 'D', 'D', 'D', 'D', 'D', 'D', 'D', 'D', 'D', 'J', 'D']
ids.sort()  #重新排序
print(ids)
news_ids = []
for id in ids:
    if id not in news_ids:
        news_ids.append(id)
print(news_ids)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

结果:

['B', 'B', 'B', 'C', 'D', 'D', 'D', 'D', 'D', 'D', 'D', 'D', 'D', 'D', 'D', 'D', 'D', 'D', 'D', 'D', 'D', 'D', 'D', 'D', 'D', 'D', 'D', 'D', 'D', 'D', 'D', 'D', 'D', 'D', 'D', 'D', 'D', 'D', 'D', 'D', 'D', 'D', 'D', 'D', 'D', 'D', 'D', 'D', 'E', 'E', 'F', 'F', 'F', 'F', 'F', 'F', 'F', 'F', 'F', 'F', 'F', 'F', 'F', 'F', 'F', 'F', 'F', 'H', 'H', 'H', 'H', 'H', 'H', 'H', 'H', 'I', 'I', 'I', 'I', 'I', 'I', 'J', 'K', 'K', 'K']
['B', 'C', 'D', 'E', 'F', 'H', 'I', 'J', 'K']
  • 1
  • 2

3、import itertools

import itertools
ids = ['H', 'H', 'B', 'H', 'H', 'D', 'F', 'F', 'F', 'D', 'C']
ids.sort()  #改变顺序
print(ids)
it = itertools.groupby(ids)
for k, g in it:
    print(k)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

结果:

['B', 'C', 'D', 'D', 'F', 'F', 'F', 'H', 'H', 'H', 'H']
B
C
D
F
H
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

不改变顺序

import itertools
ids = ['H', 'H', 'B', 'H', 'H', 'D', 'F', 'F', 'F', 'D', 'C']
it = itertools.groupby(ids)
for k, g in it:
    print(k)
  • 1
  • 2
  • 3
  • 4
  • 5

结果:

H
B
H
D
F
D
C
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

4、reduce函数

from functools import reduce
ids = ['H', 'H', 'B', 'H', 'H', 'D', 'F', 'F', 'F', 'D', 'C']
func = lambda x,y:x if y in x else x + [y]
print(reduce(func, [[], ] + ids))
  • 1
  • 2
  • 3
  • 4

结果:

['H', 'B', 'D', 'F', 'C']
  • 1

5、用空列表“装数据”

list2 = []
list1 = ids = ['H', 'H', 'B', 'H', 'H', 'D', 'F', 'F', 'F', 'D', 'C']
for i in list1:
    if i not in list2:
        list2.append(i)
print(list2)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

结果:

['H', 'B', 'D', 'F', 'C']

  • 1
  • 2
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/583166
推荐阅读
相关标签
  

闽ICP备14008679号