python技巧

itertools模块

2018-09-12  本文已影响0人  陆_志东

创建自然序列count

import itertools

natuals = itertools.count(1)
for i in natuals:
    print(i)
>>1
>>2
>>3
...
这会造成一个无限循环,无限打印自然序列,需要强制停止程序

无限循环重复传入的序列cycle

注意:传入的参数类型需要是可迭代对象

import itertools

# 传入列表
cs = itertools.cycle([1,2,3])
run_num = 0
for i in cs:
    run_num += 1
    if run_num == 5:
        break
    print(i)
>>1
>>2
>>3
>>1

# 传入字符串
cs1 = itertools.cycle("abc")
run_num = 0
for i in cs1:
    run_num += 1
    if run_num == 5:
        break
    print(i)
>>a
>>b
>>c
>>a

# 传入字典,默认循环字典的key, 可以通过字典的items方法和values方法生成一个序列,变相的实现指定循环的元素
cs2 = itertools.cycle({"a":1,"b":2})
run_num = 0
for i in cs2:
    run_num += 1
    if run_num == 5:
        break
    print(i)
>>a
>>b
>>a
>>b

# 传入层级结构
cs3 = itertools.cycle({"a":1,"b":2}.items())
run_num = 0
for i in cs3:
    run_num += 1
    if run_num == 5:
        break
    print(i)

cs4 = itertools.cycle([{"a":1},{"b":2}])
run_num = 0
for i in cs4:
    run_num += 1
    if run_num == 5:
        break
    print(i)

上面的for循环限制循环迭代的次数,还可以通过takewhile方法来替代,书写更方便

cs4 = itertools.cycle([{"a":1},{"b":2},{"c":3},{"d":4},{"e":5},{"d":4}])
ns = itertools.takewhile(lambda x:list(x.values())[0]<5,cs4)
# 然后不使用for循环迭代,使用list迭代
print(list(ns))
>>[{'a': 1}, {'b': 2}, {'c': 3}, {'d': 4}]

讲解:takewhile(function(arg1),iterable)
takewhile接收两个参数,第一个参数是一个函数,要求函数返回布尔值,如果返回True,takewhile会继续迭代,如果返回False,就会停止迭代
takewhile会将每次迭代可迭代对象得到的值传到第一个函数中,函数根据逻辑处理这个值返回布尔结果,
takewhile会根据这个结果决定是否继续循环迭代

chain(iterable,iterable,...)

将多个可迭代对象连接起来形成一个更大的迭代器,传入的可迭代对象不限制,即可传2个可迭代对象,也可以传多个可迭代对象,传入的只要是可迭代对象,类型不同也没有关系

import itertools
c = itertools.chain("abc","def")
print(list(c))
>>['a', 'b', 'c', 'd', 'e', 'f']
c2 = itertools.chain("abc",[1,2,3],{"d":4,"e":5})
print(list(c2))
>>['a', 'b', 'c', 1, 2, 3, 'd', 'e']

groupby(iterable[,function(arg1)])把迭代器中相邻的重复元素挑出来放在一起

注意: 不相邻的数据重复了并不会跳出来.
groupby会将比较后重复的数据作为key返回,比如下面代码中添加了匿名函数后返回的小写的a和b

import itertools

# no function agrument
for key,group in itertools.groupby("AaaBBBbbb"):
    print("key:",key,"group:",list(group)) # 返回的group 是一个迭代器
>>key: A group: ['A']
>>key: a group: ['a', 'a']
>>key: B group: ['B', 'B', 'B']
>>key: b group: ['b', 'b', 'b']

# add function to make them case-insensitive
for key,group in itertools.groupby("AaaBBBbbb",lambda x:x.lower()):
    print("key:", key, "group:", list(group))
>>key: a group: ['A', 'a', 'a']
>>key: b group: ['B', 'B', 'B', 'b', 'b', 'b']
上一篇下一篇

猜你喜欢

热点阅读