下面介绍列表的查询、遍历、判定、排序、乱序及反转操作,列表的其他常规操作如增加删除元素等详见我的上篇博客。

# 8、查询操作
# 8.1、获取某个元素  name[index],通过索引获取
list1 = [1, 3, 5, 8]
print(list1[-1])  # 查询最后一个元素,结果为8
# 8.2、获取元素的索引  
# name.index(value, start, stop) 获取数值为value的元素的索引,后两个参数为查询范围,
# 如果有多个元素一样,则会返回从左往右查找到的第一个指定数值元素的下标
list1 = [1, 3, 5, 8]
print(list1.index(3))    # 结果为1
print(list1.index(10))   # 列表中没有这个元素,显示ValueError: 10 is not in list
# 8.3、获取指定元素的个数  name,count(object)
list1 = [1, 3, 5, 3, 8]
print(list1.count(3))    # 结果为2
# 8.3、获取多个元素  通过切片的方式,与字符串的切片操作类似,形式为
# name[start, stop, step],范围为[start, stop),step默认为1
list1 = [1, 3, 5, 3, 8]
print(list1[1:4])  # 结果为[3, 5, 3]
print(list1[::-1])  # 结果为[8, 3, 5, 3, 1],当step为负数时从右往左查询,可以用来翻转列表

# 9、遍历操作
# 9.1、根据元素进行遍历
list1 = [1, 3, 5, 7, 8]
currentIndex = 0
for num in list1:
    print(list1.index(num, currentIndex), num)    # 输出索引及其对应的元素
    currentIndex += 1
# 9.2、根据索引遍历列表
list1 = [1, 3, 5, 7, 8]
count = len(list1)   # 获取列表长度
nums = range(count)  # 创建一个新的列表放原来列表的索引
for num in nums:
    print(num, list1[num])  # 输出索引及其对应的元素
# 9.3、通过创建对应的枚举对象 enumerate(sequence)
list1 = ["a", "b", "c", "d"]
enu = enumerate(list1)  # 创建相应的枚举对象
print(list(enu))   # 把枚举对象列表化后输出结果为[(0, 'a'), (1, 'b'), (2, 'c'), (3, 'd')]
for idx, val in enumerate(list1):
    print(idx, val)           # 分别打印出列表中的索引及其对应的元素
# 9.4、使用迭代器进行遍历
# 判断一个对象是否是可迭代对象,判断依据是能否作用于for..in,
# 字符串、列表、元组等都为可迭代对象
import collections
list1 = [1, 2, 3]
result = isinstance(list1, collections.Iterable)
print(result)   # 结果为True,当判定结果为True时则为可迭代对象
# 判断一个对象是否是迭代器
# 迭代器是指可以记录遍历位置的对象,从第一个元素开始,往后通过next()函数进行遍历,
# 只能往前不能往后,
# 遍历依据是能否作用于next()函数,判断方法如下:
import collections
list1 = [1, 2, 3]
result = isinstance(list1, collections.Iterator)
print(result)   # 结果为False,可迭代对象不一定是迭代器,但迭代器一定是可迭代对象
# 迭代器的特性:
# 1、仅仅在迭代到某个元素时才处理该元素,在此之前,元素可以不存在,在此之后,
#    元素可以被销毁,适用于一些巨大或无限的数据集;
# 2、提供了一个统一的访问集合的接口,不同数据类型遍历的方式不同,如果先转换为迭代器再访问,
#    则可以统一接口。
# 可以通过iter(iterable)函数将可迭代对象转换为迭代器
# 使用迭代器进行遍历,先创建迭代器对象,再通过for循环遍历
list1 = [1, 2, 3]
it = iter(list1)        # 转换为迭代器,遍历时指针会自动往后移动
for i in it:
    print(i)   # 遍历,结果为输出各元素,迭代器只能遍历一次,若想再次遍历需重新创建

# 10、判定元素是否在列表中,利用in或not in
list1 = [1, 2, 3]
print(1 in list1)            # 结果为True
print(8 not in list1)        # 结果为True

# 11、排序
# 方式1:利用内嵌函数sorted(Iterable, key = None, reverse = False)进行排序,
# Iterable是可迭代对象,key是关键字,reverse是升降序,默认升序,
# 返回排好序的列表,但原列表没有发生变化
list1 = [("xx2", 1), ("xx1", 2), ("xx3", 3), ("xx4", 5)]
print(sorted(list1))  # 结果为[('xx1', 2), ('xx2', 1), ('xx3', 3), ('xx4', 5)]
# 由上面的结果可以看出,如果没有指定关键字,只会针对每个元组中的第一个元素进行排序
def getkey(x):
    return x[1]  # 返回元组的第二个元素

result = sorted(list1, key=getkey)
print(result)    # 结果为[('xx2', 1), ('xx1', 2), ('xx3', 3), ('xx4', 5)]
# 方式2:利用列表中的排序函数name.sort(key=None, reverse=False),返回None,且原列表会变化
list1 = [("xx2", 1), ("xx1", 2), ("xx3", 3), ("xx4", 5)]
print(list1)  
# 结果为[('xx1', 2), ('xx2', 1), ('xx3', 3), ('xx4', 5)],只是对元组的第一个元素进行排序
def getkey(x):
    return x[1]  # 返回元组的第二个元素

result = list1.sort(key=getkey)
print(result, list1)   # 结果为None [('xx2', 1), ('xx1', 2), ('xx3', 3), ('xx4', 5)]

# 12、乱序,随机打乱一个列表,利用random.shuffle(list),返回None
import random
list1 = [1, 2, 3, 4]
res = random.shuffle(list1)
print(res, list1)          # 结果为None [1, 4, 2, 3],即说明原列表发生了改变

# 13、反转
# 方法1:利用切片,原列表没有发生改变
list1 = [1, 2, 3, 4]
print(list1[::-1])       # 结果为[4, 3, 2, 1]
# 方法2:利用list,reverse(),返回None,原列表发生改变
print(list1.reverse(), list1)   # 结果为None [4, 3, 2, 1]