5. 列表 常用操作

<!DOCTYPE html>

list操作

<script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/latest.js?config=TeX-AMS_HTML"></script>
<!-- MathJax configuration -->
<script type="text/x-mathjax-config">
MathJax.Hub.Config({
    tex2jax: {
        inlineMath: [ ['$','$'], ["\\(","\\)"] ],
        displayMath: [ ['$$','$$'], ["\\[","\\]"] ],
        processEscapes: true,
        processEnvironments: true
    },
    // Center justify equations in code and markdown cells. Elsewhere
    // we use CSS to left justify single line equations in code cells.
    displayAlign: 'center',
    "HTML-CSS": {
        styles: {'.MathJax_Display': {"margin": 0}},
        linebreaks: { automatic: true }
    }
});
</script>
<!-- End of mathjax configuration --></head>

1.通过列表间接修改字符串

In [112]:
data = "hello"
In [113]:
list(data)
Out[113]:
['h', 'e', 'l', 'l', 'o']
In [114]:
data = list(data)
In [115]:
data
Out[115]:
['h', 'e', 'l', 'l', 'o']

赋值

In [116]:
data[1]='改变'
In [117]:
data
Out[117]:
['h', '改变', 'l', 'l', 'o']

拼接修改后的字符串

In [118]:
''.join(data)
Out[118]:
'h改变llo'
In [119]:
lis = [1,2,3,4]

2. 列表数据增加的几种方式

(1)在尾部追加一个元素

In [120]:
lis.append(5)
lis
Out[120]:
[1, 2, 3, 4, 5]

(2)根据下标插入一个元素

In [121]:
lis.insert(1,'插入')
lis
Out[121]:
[1, '插入', 2, 3, 4, 5]

也可以使用切片进行这种效果,但是可读性不是很高,且插入的元素必须在列表中

In [122]:
lis[2:2]=1
lis
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-122-2d89c90a4906> in <module>
----> 1 lis[2:2]=1
      2 lis

TypeError: can only assign an iterable
In [124]:
lis[2:2]=[1]
print(lis)
del lis[2]
lis
[1, '插入', 1, 2, 3, 4, 5]
Out[124]:
[1, '插入', 2, 3, 4, 5]

(3)使用extend方法,列表形式插入多个元素

将两个列表进行扩展,和直接使用+拼接所不同的是,这种方式是直接修改旧的列表,+是返回拼接后的一个新列表,不会更改旧的列表

In [125]:
lis+['常规','增加']
lis
Out[125]:
[1, '插入', 2, 3, 4, 5]
In [126]:
lis.extend(['常规','增加'])
lis
Out[126]:
[1, '插入', 2, 3, 4, 5, '常规', '增加']

(4)使用索引插入一个元素

如果想插入多个元素,可以使用切片,例如 a=[1,2,3] b=[4,5,6]

a[len(a):]=b

In [128]:
lis[0]='索引的方式插入第一个元素'
lis
Out[128]:
['索引的方式插入第一个元素', '插入', 2, 3, 4, 5, '常规', '增加']

3. 列表元素的删除方式

(1)pop方法:通过元素下标进行删除,未填写下标时,默认从列表末尾删除,并返回这个元素

In [140]:
tmp = [1,2,3,4,5]
print(tmp.pop())

print(tmp)
5
[1, 2, 3, 4]
In [141]:
tmp.pop(0)
Out[141]:
1
In [144]:
tmp
Out[144]:
[2, 3, 4]

(2)remove方法:通过具体的元素名字进行删除

In [145]:
x = ['please', 'input','your','name']
In [146]:
x.remove('input')
In [147]:
x
Out[147]:
['please', 'your', 'name']

(3)del方法: 使用系统的内置函数进行删除

删除列表元素:指定下标进行删除

In [148]:
del x[0]
x
Out[148]:
['your', 'name']

还能够删除整个的列表

In [149]:
del x
x   # 删除完成,所以报错
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-149-1beca76b84e9> in <module>
      1 del x
----> 2 x

NameError: name 'x' is not defined

4.列表排序

(1)sort方法:从小到大排序,对原来的列表进行修改,然后进行排序输出

In [150]:
lst = [4,6,2,1,7,9]
In [151]:
lst.sort()
print(lst)
[1, 2, 4, 6, 7, 9]

(2)sortd方法:从小到大排序,在不改变原列表的情况下,返回一个已经排序好了的列表副本

In [152]:
lt =[1,3,2,4]
In [154]:
lt.sorted()
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-154-19d694fab809> in <module>
----> 1 lt.sorted()

AttributeError: 'list' object has no attribute 'sorted'

注意:这种调用方式与sort()不一样,sort list类中的一个实例方法,而sorted()是文件中的一个普通方法

In [158]:
sorted(lt)
Out[158]:
[1, 2, 3, 4]
In [176]:
lt
Out[176]:
[1, 3, 2, 4]
In [177]:
sorted('wordld')  # 实际上,这个函数可以用于所有的可迭代序列,但是返回值永远是列表而已
Out[177]:
['d', 'd', 'l', 'o', 'r', 'w']
In [ ]:
 

如果我们想从大到小排序,可以在从小到大排序之后使用切片直接进行输出

In [162]:
c = sorted(lt)
print(c)

print(c[::-1])  # 逆序输出
[1, 2, 3, 4]
[4, 3, 2, 1]

列表的两个逆序输出方法,除了上面讲述的切片还有一个

(1)reverse:逆序输出列表中的元素

In [164]:
u=[1,2,3]
In [166]:
u.reverse()
print(u)
[1, 2, 3]

有一个类似于reverse的反转序列方法,reversed(),反转序列后生成迭代器

5.列表查询

(1)count:通过元素名,统计指定的元素在列表中出现了多少次

In [170]:
c = ['to','to','ccc']
In [171]:
c.count('to')
Out[171]:
2

(2)index:通过索引,查询列表中该值第一次出现的索引

In [172]:
c.index('to')
Out[172]:
0
In [173]:
c.index('to')
Out[173]:
0
In [178]:
c.index('toooo')  # 如果找不到就会报异常,可以用异常捕获进行处理
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-178-a770edb5c763> in <module>
----> 1 c.index('toooo')

ValueError: 'toooo' is not in list

6.列表取值

In [179]:
p = [1,2,3,4,6,7,8]
In [180]:
p[0]  # 单元素取值
Out[180]:
1

【序列】切片取值

序列【首索引:尾索引:顺序+步长】

格式:字符串[开始下标:结束下标:步长] #字符串[开始下标:结束下标]确定范围时不包括结束下标本身的值  

(左闭右开区间,包含左侧索引值对应的元素,但不包含右侧索引值对应的元素)
"不加步长的情况"
a[0:4] #注意:这里面的结果不是hello,而是hell。这里面的不取尾数值
a[:] #如果前面和后面都不写,表示从头取到尾
a[:5] #表示从头取到下标为4的字符,因为不取尾数值
a[-4:] #表示从-4的下标取,取到末尾的数
"加步长的情况"
a[::2] #hlowrd,表示从前往后开始,步长为2个距离长度取值
helloworld
a[::-2] #drwolh,步长为负数,表示从后往前开始,步长为2个距离长度取值
a[:-5:-2] #dr :首先确定步长为负数,就是从后往前方向取(每隔2个),然后开始下标变成了结尾下标,直到-5的位置

In [183]:
ab="xiaoxingyun"
In [186]:
ab[-2:1:-1]
Out[186]:
'uygnixoa'

可以通过切片实现一些小题目

In [187]:
print(list(range(1,101)[::2]))  # 输出1-100中的所有奇数
[1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41, 43, 45, 47, 49, 51, 53, 55, 57, 59, 61, 63, 65, 67, 69, 71, 73, 75, 77, 79, 81, 83, 85, 87, 89, 91, 93, 95, 97, 99]

利用range函数生成1-100的数,然后我们取3的倍数,并且取最后十个。

In [189]:
list(range(1,100)[2::3])  # 最小的数数3,下标为2
Out[189]:
[3,
 6,
 9,
 12,
 15,
 18,
 21,
 24,
 27,
 30,
 33,
 36,
 39,
 42,
 45,
 48,
 51,
 54,
 57,
 60,
 63,
 66,
 69,
 72,
 75,
 78,
 81,
 84,
 87,
 90,
 93,
 96,
 99]
In [190]:
list(range(1,100)[2::3])[:-11:-1]   # 逆序取10个
Out[190]:
[99, 96, 93, 90, 87, 84, 81, 78, 75, 72]

列表+集合+sort高级排序

In [191]:
a={'1':1,'2':2}
In [199]:
name = ['张三','李四','王五','王五']
In [206]:
tmp = list(set(name)) # 使用集合进行去重,转换成集合后会默认去重
In [207]:
tmp
Out[207]:
['王五', '李四', '张三']

可以看到去重后,列表的顺序变了,在需要使用到zip()聚合函数,需要对姓名和身份证号进行聚合时,一旦顺序错了,会引发bug

In [211]:
tmp.sort(key=name.index)  # 按照原来的元素顺序排列
In [212]:
tmp
Out[212]:
['张三', '李四', '王五']

猜你喜欢

转载自www.cnblogs.com/zhongzhouyun/p/12264480.html