Python十大列表操作技巧分享
作者:微小冷
列表展开
对于形如 [ 1 , [ 2 ] , [ [ 3 ] , 4 ] , 5 ] 的列表,将其展开为 [ 1 , 2 , 3 , 4 , 5 ]。算法思路为,遍历列表A0中的元素,如果该元素A1仍为列表,则将A1的元素追加到A0的末尾。
def flatten(lst):
i = 0
while(i<len(lst)):
if isinstance(lst[i],list):
lst.extend(lst[i])
i += 1
return [n for n in lst if not isinstance(n,list)]
lst = [1, [2], [[3], 4], 5]
flatten(lst)
# [1, 5, 2, 4, 3]
降维
当列表中的所有数据均为列表时,可以通过单星号索引之后,用itertools中的chain函数进行拼接。
from itertools import chain a = [[1, 2], [3, 4], [5, 6]] chain(*a) # [1, 2, 3, 4, 5, 6]
分块
python内置了map函数,可以遍历列表并对每个元素进行映射。对于list(map(func,myList)),等价于[func(e) for e in myList]。根据这个特性,可以对列表进行分块。
from math import ceil #ceil为向上取整
def chunkByFor(lst, size):
return [lst[x*size:x*size+size]
for x in range(0,ceil(len(lst)/size))]
def chunkByMap(lst, size):
return list(
map(lambda x: lst[x * size:x * size + size],
list(range(0, ceil(len(lst) / size)))))
chunk([1,2,3,4,5],2) # [[1,2],[3,4],5]
转置
zip可以像拉链一样将数组中对应的值缝合起来,以元组的形式重新存储。根据这个特性,可完成列表的"转置"。
lst = [[1,2], [3,4], [5,6]] list(zip(*lst)) #[(1, 3, 5), (2, 4, 6)]
查找众数
列表中封装了count方法,可以统计其中的元素个数,例如
lst = [1,2,1,2,3,2,1,4,2] lst.count(1) # 3 即lst中1出现了3次
而最大值选取函数max中有一个参数key,表示选取最大值的依据,例如
x = [-2,-1,0,1,2] def test(x): return x**2-2*x max(x,key=test) # -2
表示选出当函数test值最大时的自变量。
根据这两个特点,可以得到查找列表中出现次数最多元素的方法为
lst = [1,2,3,4,5,2,3,2,1,2,4] max(set(lst),key=lst.count) # 2
判断重复元素
借助集合中元素不重复的特性,可以检验非集合数据中是否有重复数据。下面代码种,set可将列表转换为集合,如果转换之后元素个数不变,则说明列表中没有重复元素。
def isUnique(lst):
return len(lst) == len(set(lst))
x = [1,2,3,4,5,5]
y = [1,2,3,4,5]
isUnique(x) # False
isUnique(y) # True
比较元素差异
在python中,集合set提供了类似做差的操作difference。对于集合A和B而言,若想实现A-B的功能,可采取A.difference(B)的方案。
对于其他数据结构,可先转为set再行做差。且difference会自动将输入变量转为set。
A = [1,2,3] B = [1,2,4] list(set(A).difference(B)) # [3]
比较列表计算后的差异
现有一函数func,对于两组数据A和B,如果希望得到func(A)和func(B)的差别,也可以采用set的特性。
def funcMinus(A, B, func):
B = set(map(func, B)) #剔除func(B)中的重复元素
return [a for a in A if fn(a) not in B]
- 筛选数据
filter是python的内置函数,用于过滤不符合条件的数据。list(filter(func,myList))等价于[e for e in myList if func(e)==1]。
为列表添加索引
enumerate可以将列表、元组等组合为索引序列,并可以声明初始值,例如
orders = ['first','second','third'] list(enumerate(orders)) # [(0, 'first'), (1, 'second'), (2, 'third')] list(enumerate(orders,2)) # [(2, 'first'), (3, 'second'), (4, 'third')]
这可以非常方便地应用到for循环中
>>> for i,val in enumerate(orders,1): ... print(i,val) ... 1 first 2 second 3 third
回文
在python中,对列表或者字符串采用:进行索引,例如a:b指的是从a到b的数据;当采用双引号::时,引号间的值的意义就发生了变化,例如a:b:c表示从a到b,间隔为c的数据。
据此,可以得到::-1表示将字符串颠倒过来,据此可以判断一个字符串是否为回文结构
>>> s = "abcde" >>> s[::-1] 'edcba' >>> s == s[::-1] False
到此这篇关于Python十大列表操作技巧分享的文章就介绍到这了,更多相关Python列表操作技巧内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
