美文网首页
Python模块---itertools操作迭代对象

Python模块---itertools操作迭代对象

作者: 吾星喵 | 来源:发表于2019-02-11 15:28 被阅读1次

itertools操作迭代对象

count()无限迭代器

itertools.count(start=0, step=1)创建一个迭代器,生成从n开始的连续整数,如果忽略n,则从0开始计算(注意:此迭代器不支持长整数)

如果超出了sys.maxint,计数器将溢出并继续从-sys.maxint-1开始计算。

import itertools


natuals = itertools.count(1)  # 表示以1开始,可以以任何值(包含负数)开始
print(natuals)  # count(1)
for item in natuals:
    print(item)
'''
1
2
3
4
5
6
...
'''

因为count()会创建一个无限的迭代器,所以上述代码会打印出自然数序列,根本停不下来,只能按Ctrl+C退出。

cycle()无限迭代器

cycle()会把传入的一个序列无限重复下去

cs = itertools.cycle('ABC')  # 注意字符串也是序列的一种
print(cs)  # <itertools.cycle object at 0x000001F8DF068EE8>
for c in cs:
    print(c)
'''
A
B
C
A
B
C
A
...
'''

repeat()可指定循环次数

itertools.repeat(object[, times])创建一个迭代器,重复生成object,times(如果已提供)指定重复计数,如果未提供times,将无止尽返回该对象。

repeat()负责把一个元素无限重复下去,不过如果提供第二个参数就可以限定重复次数

ns = itertools.repeat('AB', 3)  # 3表示只循环3次,如果没有这个参数,会一直循环下去
for n in ns:
    print(n)
'''
AB
AB
AB
'''

takewhile()条件停止迭代

无限序列只有在for迭代时才会无限地迭代下去,如果只是创建了一个迭代对象,它不会事先把无限个元素生成出来,事实上也不可能在内存中创建无限多个元素。

无限序列虽然可以无限迭代下去,但是通常我们会通过takewhile()等函数根据条件判断来截取出一个有限的序列:

natuals = itertools.count(1)

ns = itertools.takewhile(lambda x: x <= 10, natuals)

print(ns)  # <itertools.takewhile object at 0x000001D329FA6808>
print(list(ns))  # [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

chain()串联迭代对象

chain()可以把多组迭代对象串联起来,形成一个更大的迭代器,就好像他们是来自于一个单一的序列。itertools.chain('ABC', 'XYZ', '123')多个可迭代对象也是可行的

for c in itertools.chain('ABC', 'XYZ'):
    print(c)
'''
A
B
C
X
Y
Z
'''

groupby()相邻重复元素组合

groupby()把迭代器中相邻的重复元素挑出来放在一起

for key, group in itertools.groupby('AAABBBCCAAA'):
    print(key, group)
'''
A <itertools._grouper object at 0x000001A5F13C9BA8>
B <itertools._grouper object at 0x000001A5F1461AC8>
C <itertools._grouper object at 0x000001A5F13C9BA8>
A <itertools._grouper object at 0x000001A5F1461A90>
'''

for key, group in itertools.groupby('AAABBBCCAAA'):
    print(key, list(group))
'''
A ['A', 'A', 'A']
B ['B', 'B', 'B']
C ['C', 'C']
A ['A', 'A', 'A']
'''

实际上挑选规则是通过函数完成的,只要作用于函数的两个元素返回的值相等,这两个元素就被认为是在一组的,而函数返回值作为组的key。如果我们要忽略大小写分组,就可以让元素'A'和'a'都返回相同的key:

for key, group in itertools.groupby('AaaBBbcCAAa', lambda c: c.upper()):
    print(key, list(group))
'''
A ['A', 'a', 'a']
B ['B', 'B', 'b']
C ['c', 'C']
A ['A', 'A', 'a']
'''

product()笛卡尔积

笛卡尔积:itertools.product(*iterables[, repeat])

直接对自身进行笛卡尔积:

for item in itertools.product('ABCD'):  # repeat默认为1
    print(item)
'''
('A',)
('B',)
('C',)
('D',)
'''
for item in itertools.product('ABCD', repeat=2):
    print(''.join(item), end=' ')
'''
AA AB AC AD BA BB BC BD CA CB CC CD DA DB DC DD
'''

总数量为len('ABCD') ** repeat等于4**2=16

两个元组进行笛卡尔积,product(list1, list2) 依次取出list1中的每1个元素,与list2中的每1个元素,组成元组,然后,将所有的元组组成一个列表,返回。

a = (1, 2, 3)
b = ('A', 'B', 'C')
c = itertools.product(a, b)
for item in c:
    print(item, end=' ')
    # (1, 'A') (1, 'B') (1, 'C') (2, 'A') (2, 'B') (2, 'C') (3, 'A') (3, 'B') (3, 'C')

permutations()排列

for item in itertools.permutations('ABCD', 2):  # 两个进行排列,不含自身重复
    print(''.join(item), end=' ')
    # AB AC AD BA BC BD CA CB CD DA DB DC

combinations()组合

for item in itertools.combinations('ABCD', 2):  # 两个进行排列,不含自身重复,不交换元素
    print(''.join(item), end=' ')
    # AB AC AD BC BD CD

combinations_with_replacement()组合包含自身重复

for item in itertools.combinations_with_replacement('ABCD', 2):
    print(''.join(item), end=' ')
    # AA AB AC AD BB BC BD CC CD DD

相关文章

  • itertools

    python 模块itertools 提供了非常有用的用于操作迭代对象的函数。 首先,我们看看itertools...

  • Day16内建模块itertools&urllib

    itertools Python的内建模块itertools提供了非常有用的用于操作迭代对象的函数。首先,我们看看...

  • itertools

    Python的内建模块itertools提供了非常有用的用于操作迭代对象的函数。 首先,我们看看itertools...

  • python学习-itertools模块

    Python的内建模块itertools提供了非常有用的用于操作迭代对象的函数。 首先,我们看看itertools...

  • Python的itertools模块

    python的自建模块itertools提供了非常有用的用于操作迭代对象的函数。 首先,我们看看itertools...

  • Python itertools的使用

    简介 Python的内建模块itertools提供了非常有用的用于操作迭代对象的函数。 无限迭代器 countco...

  • Python模块---itertools操作迭代对象

    itertools操作迭代对象 count()无限迭代器 itertools.count(start=0, ste...

  • 【Python入门】28.常用内置模块之 操作迭代对象itert

    摘要:itertools模块介绍;常用的操作迭代对象函数:count(),cycle(),repeat(),tak...

  • itertools模块详解

    介绍 itertools是python内置的模块,提供了若干个用于操作迭代对象的函数,使用简单且功能强大。方便以后...

  • 53. itertools

    Python的内建模块itertools提供了非常有用的用于操作迭代对象的函数。cycle()会把传入的一个序列无...

网友评论

      本文标题:Python模块---itertools操作迭代对象

      本文链接:https://www.haomeiwen.com/subject/cmuqeqtx.html