python - itertools模块

一、 itertools模块

itertools是一个和迭代器相关的标准库,其中包含许多用来处理可迭代对像的工具函数

二、部分函数介绍

1、使用product()扁平化多层嵌套循环

题来了

list1 = [1, 2, 4, 5, 6, 3]

list2 = [1, 2, 4, 5]

list3 = [2, 4, 5]

求以上三个列表,寻找加一起是4的三个数

写法1:

number1 = [1, 2, 4, 5, 6, 3]
number2 = [1, 2, 4, 5]
number3 = [2, 4, 5]
for num1 in number1:
    for num2 in number2:
        for num3 in number3:
            if num1 + num2 + num3 == 4:
                print(f"{num1}+{num2}+{num3}={num1 + num2 + num3}")


输出:
1+1+2=4

 三层for循环看起来有点脑瓜疼,试试下种

写法2:

from itertools import product

number1 = [1, 2, 4, 5, 6, 3]
number2 = [1, 2, 4, 5]
number3 = [2, 4, 5]

for num1, num2, num3 in product(number1, number2, number3):
    if num1 + num2 + num3 == 4:
        print(f"{num1}+{num2}+{num3}={num1 + num2 + num3}")


输出结果:
1+1+2=4

是不是更简洁呢

product()接收多个迭代对像,然后生成一个笛卡尔积,什么是笛卡尔积呢,其实我也没弄懂,我就作了个实验

from itertools import product

number1 = [1,2]
number2  = [2,3]
print(list(product(number1,number2)))

输出结果:[(1, 2), (1, 3), (2, 2), (2, 3)]

我理解就是把数组中的元素全部组合一次,然后出来一个全部组合

那如果他是个字典,组出来是什么样呢

number1 = {"key1": 1, "key2": 2}
number2 = {"key1": 4, "key2": 5}
print(list(product(number1, number2)))

[('key1', 'key1'), ('key1', 'key2'), ('key2', 'key1'), ('key2', 'key2')]

 三、使用islice()实现循环内隔行处理

有这样一个文本内容      

jdflakfjalkfjakdlfj
------------------
fdsjalksfjak;sfja;lfj
-------------------
fldsajflkasfj;ajf

我想要除了“--------------------”以外的内容

 写法一:

def get_userful_data():
    with open("./file.txt", "r") as f:
        for row_index, line in enumerate(f):
            if row_index % 2 == 0:
                yield line.strip()


if __name__ == '__main__':
    result = get_userful_data()
    while True:
        try:
            print(next(result))
        except StopIteration:
            break



输出:
jdflakfjalkfjakdlfj
fdsjalksfjak;sfja;lfj
fldsajflkasfj;ajf

方法二:islice(seq,start,end,step),我们只要设置step步长就行

def get_userful_data():
    with open("./file.txt", "r") as f:
        for line in islice(f,0,None,2):
            yield line

if __name__ == '__main__':
    result = get_userful_data()
    while True:
        try:
            print(next(result))
        except StopIteration:
            break




输出:
jdflakfjalkfjakdlfj
fdsjalksfjak;sfja;lfj
fldsajflkasfj;ajf

四、用takewhile 代替break

names = ["leilei","huahua","mama","dongdong"]

这是一个列表,如果名子等于mama就退出循环

1、写法一


def is_contain_mama(name):
    return "mama" in name


def print_name_contain_mama(names):
    for name in names:
        if is_contain_mama(name):
            break
        print(name)


if __name__ == "__main__":
    names = ["leilei", "huahua", "mama", "dongdong"]
    print_name_contain_mama(names)

 2、写法二:takewhile(prodicate,iterable)

takewhile(prodicate,iterable)

会在迭代第二个参数iterable的过程中,不断使用当前值调用prodicate函数,如果就继续下个迭代,如果是假就中止迭代

def is_contain_mama(name):
    return "mama" not in name


def print_name_contain_mama(names):
    for name in  takewhile(is_contain_mama,names):
        print(name)


if __name__ == "__main__":
    names =  ["leilei","huahua","mama","dongdong"]
    print_name_contain_mama(names)

 

你可能感兴趣的:(python杂记,python)