一、合并多个有序序列,再对整个有序序列进行迭代 ----> heapq.merge
1、 heapq.merge 的迭代性质意味着它对所有提供的序列都不会做一次性读取,因此在处理长序列时,开销比较小
2、heapq.merge() 要求所有输入的序列都是有序的,因为函数本身不会对输入做任何关于是否有序的验证
3、heapq.merge() 只是简单的检查每个输入序列中的第一个元素,将最小的发送出去,然后再从之前选择的序列 中读取一个新的元素,重复执行此步骤
"""
1、合并多个有序序列,再对整个有序序列进行迭代 ----> heapq.merge
2、heapq.merge 的迭代性质意味着它对所有提供的序列都不会做一次性读取,因此在处理长序列时,开销比较小
3、heapq.merge() 要求所有输入的序列都是有序的,因为函数本身不会对输入做任何关于是否有序的验证
4、heapq.merge() 只是简单的检查每个输入序列中的第一个元素,将最小的发送出去,然后再从之前选择的序列
中读取一个新的元素,重复执行此步骤
"""
import heapq
a = [1, 4, 7, 10]
b = [2, 5, 6, 11]
c = [3, 8, 11, 12]
d = heapq.merge(a, b, c)
print(d)
for item in d:
print(item, end=' ')
a1 = [10, 7, 4, 1]
b1 = [2, 5, 6, 11]
c1 = [3, 8, 11, 12]
d1 = heapq.merge(a1, b1, c1)
print('\n')
for item in d1:
print(item, end=' ')
print('\n')
def Merge(l1, l2):
l3 = []
len1, len2 = len(l1), len(l2)
p1, p2 = 0, 0
while p1 < len1 or p2 < len2:
if p1 == len1: # 判断序列1是否遍历完成
l3.append(l2[p2])
p2 += 1
elif p2 == len2: # 判断序列2是否遍历完成
l3.append(l1[p1])
p1 += 1
elif l1[p1] <= l2[p2]: # 仅用此判断,当某个序列遍历完成后,索引值继续加1,由于or语句的存在,会再次进入循环中,于是出现索引超出范围的情况
l3.append(l1[p1])
p1 += 1
else:
l3.append(l2[p2])
p2 += 1
return l3
if __name__ == '__main__':
print(Merge(a, b))
print(Merge(a1, b1))
二、同时迭代多个序列
1、zip(a, b)的工作原理是创建出一个迭代器,迭代的长度和其中最短的输入序列相同
2、itertools.zip_longest() 可将最长的输入序列迭代出来
"""
1、同时迭代多个序列
2、zip(a, b)的工作原理是创建出一个迭代器,迭代的长度和其中最短的输入序列相同
3、itertools.zip_longest() 可将最长的输入序列迭代出来
"""
from itertools import zip_longest
a = [1, 2, 3]
b = ['x', 'y', 'z']
c = ['A', 'B', 'C', 'D', 'E']
r1 = zip(a, b, c)
print(r1, type(r1))
for item in r1:
print(item)
r2 = zip_longest(a, b, c)
print(r2, type(r2))
for item in r2:
print(item)
三、跳过可迭代对象中的前一部分元素
1、itertools.dropwhile()函数的使用:提供一个函数和一个可迭代对象
2、itertools.dropwhile()函数只会丢弃元素,直到有某个元素不满足测试函数为止,之后的所有剩余元素都不会经过筛选而直接返回
"""
1、跳过可迭代对象中的前一部分元素
2、itertools.dropwhile()函数的使用:提供一个函数和一个可迭代对象
3、itertools.dropwhile()函数只会丢弃元素,直到有某个元素不满足测试函数为止,之后的所有剩余元素都不会经过筛选而直接返回
"""
import os
from itertools import dropwhile
# # 当前脚本的工作路径
# print(os.getcwd())
# # 获取绝对路径
# print(os.path.abspath(__file__))
# print(os.path.abspath(os.path.dirname(__file__)))
# # 获取当前文件上层目录
# print(os.path.abspath(os.path.dirname(os.path.dirname(__file__))))
# 获取上上级目录
# print(os.path.abspath(os.path.join(os.getcwd(), "../..")))
BASE_DIR = os.path.abspath(os.path.join(os.getcwd(), "../../.."))
print(BASE_DIR)
print('-' * 50)
with open(BASE_DIR + '/vm_install.conf') as f:
for line in f:
print(line)
print('-' * 50)
with open(BASE_DIR + '/vm_install.conf') as f:
for line in dropwhile(lambda lin: lin.startswith('#'), f):
print(line)