列表

一.创建

两种方法都行,一个List里面可以存储不同的类型

alist1=[]

alist2=list()

二.切片操作

通过切片可以取出一组连续的元素,相当于取出子序列。

常规写法,表示从下标0遍历到下标2位置(左闭右开):

alist1=[1,2,3,4,5,6]
print(alist1[0:3])

忽略前后边界:

alist1=[1,2,3,4,5,6]
# 从头遍历到最后
print(alist1[0:])
print(alist1[:6])
print(alist1[:])

规定自增大小:

alist1=[1,2,3,4,5,6]
# 从头遍历每次下标+2
print(alist1[::2])
# 从尾遍历每次下标-2
print(alist1[::-2])

应用例子:字符串反转

str(x)[::-1]

三.相关方法

append(obj) 在列表末尾添加新的对象
count(obj) 统计某个元素在列表中出现的次数
entend(seq) 在列表末尾一次性追加另一个序列中的多个值(用新列表扩展原来的列表)
index(obj) 从列表中找出某个值第一个匹配项的索引位置
insert(index,obj) 将对象插入列表
pop([index=-1]) 移除列表中的一个元素(默认最后一个元素),并且返回该元素的值
remove(obj) 移除列表中某个值的第一个匹配项
reverse() 反向列表中元素
sort() 对原列表进行排序

四.列表推导式

为什么要使用列表推导式?因为快+简洁。

语法:

[结果表达式 for 变量 in 可迭代对象 if 条件]
nums = [1,2,3,4,5,6,7,8,9,10]

new_nums = [i*2 for i in nums]

print(new_nums)

使用列表推导式当然也可以遍历双层嵌套循环:

[结果表达式 for 外层变量 in 外层可迭代对象 for 内层变量 in 内层可迭代对象]

使用这个方法可以扁平化代码,下面给出使用双循环和使用列表推导式的例子:

matrix = [[1,2,3],[4,5,6],[7,8,9]]
# 列表推导式
vector=[element for row in matrix for element in row]
# 双层循环
vector=[]
for row in matrix:
    for element in row:
        vector.append(element)

三层,四层,n层,都是一样的写法,遵循从外到内,照葫芦画瓢即可。

五.Pythonic技巧

1.使用 * 运算符操作剩余序列

下面的两种写法没有区别

mylist = ['a','b','c','d','e']

(el1,el2,remaining) = mylist[0], mylist[1], mylist[2:]
(el1,el2,*remaining) = mylist

(el1,middle,eln) = mylist[0], mylist[1:-1], mylist[-1]
(el1,*middle,eln) = mylist

(el1, elminus1,eln) = mylist[:-2],mylist[-2], mylist[-1]
(*el1, elminus1,eln) = mylist

2.使用 array.array 获取基本类型数组

array.array 是 array 模块提供的高效基本类型数组,专门用于存储单一类型的基本数据(如整数、浮点数、字符),相比普通列表(list),它的内存占用更小、访问速度更快(因无需存储元素类型引用,直接存储原始二进制数据)。

import array

myarr =  array.array('f',(1.0, 2.0, 3.0, 4.0, 5.0))

myarr[1] = 23.23

del myarr[1]

myarr.append(4.1)

元组

一.介绍

元组与列表类似,但是元组中的元素是不可变的。元组是一种静态数组,不支持动态扩展,其存储方式相较于列表更加紧凑,因此在同等条件下占用的内存更少。

创建时使用 ( ) 括起来,不用和列表弄混(列表使用 [ ] ):

tup = (1,2,3,4,5)

可以在以下情况下使用元组:

1)在函数中作为参数使用;
2)函数返回值包含多个项的时候使用;
3)遍历字典的键值对的时候使用;
4)作为字符串格式占位符使用。

二.Pythonic技巧

1.使用namedtuple编写更清晰的元组

namedtuple 用于创建带字段名的元组子类,不仅可以使用索引来访问元素,还可以使用字段名来访问元素。这样使用,比元组更可读,比字典更高效。

StudentScore = namedtuple("StudentScore",
                          ["name", "math", "english", "chinese"])

scores = [
    StudentScore("小明", 95, 88, 92),
    StudentScore("小红", 90, 93, 89),
    StudentScore("小刚", 85, 87, 94)
]

for s in scores:
    total = s.math + s.english + s.chinese
    print(f"{s.name} 总分:{total},平均分:{total/3:.1f}")

2.使用元组解包数据

使用 * 进行解包

group1 = ('a','b')
group2 = ('c','d')
new_group = (*group1, *group2, 'e', 'f')
print(new_group)
# Output: ('a', 'b', 'c', 'd', 'e', 'f')

3.占位符_

定义一个元组:

user  = ("KaKa",24,"China","Beijing")

如果说我们只想取前面的两个数据,可以使用占位符_来占后面的位置:

(name,age,_,_) = user

如果说后面的字段比较多,可以是*_直接表示所有后面的位置:

(name,age,*_) = user

4.多值返回

对于Java来说,方法每次只能返回一个值,如果想要返回多个类型不同的值,只能封装成一个新的对象。而Python可以使用元组进行多值返回。

def get_data_info(data):
    average = float(sum(data)) / len(data)
    sum_value = sum(data)
    max_value = max(data)
    min_value = min(data)
    return (average, sum_value, max_value, min_value)

list_of_data = [1,2,3,4,5]
print(get_data_info(list_of_data))
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐