python 超好用的迭代兵器库itertools,十八般兵器哪18般?

游戏 游戏 1627 人阅读 | 0 人回复

<
常识面

正在古典小道战传统说书中,常道技艺下强的人是“十八般技艺样样夺目”,那十八般技艺是教唆用“十八般刀兵”的工夫战妙技。哪十八般呢?
十八般刀兵正在技击界中最遍及的道法是:刀、枪、剑、戟、斧、钺、钩、叉、鞭、锏、锤、抓、镗、棍、槊、棒、拐、流星。
140822wwaa6w6gwze62z2f.jpg

汉武于元启四年(公元前107),颠末严厉的选择战收拾整顿,挑选出18种规范的刀兵:盾、镗、刀、戈、槊、鞭、锏、剑、锤、抓、戟、弓、钺、斧、牌、棍、枪、叉。
三国时期,出名的刀兵辨别家吕虔,按照刀兵的特性,对汉武帝钦定的“十八般刀兵”从头布列为九少九短。九少:戈、盾、戟、槊、镗、钺、棍、枪、叉;九短:斧、戈、牌、箭、鞭、剑、锏、锤、抓。
明朝《五纯俎》战清朝《脆散》两书所载,“十八般刀兵”为弓、弩、枪、刀、剑、盾、盾、斧、钺、戟、黄、锏、挝、殳(棍)、叉、耙头、锦绳套索、利剑挨(拳术)。先人称其为“小十八般”。
迭代器

也叫天生器,它最年夜的劣势便是提早计较按需利用,节流内乱存空间、进步运转服从。
迭代东西库 itertools 中共有18个函数,刚好似“迭代界”的十八般刀兵,把握了那些工夫战妙技也能够道是“十八般技艺样样夺目”!:
  1. >>> import itertools
  2. >>> tools = [func for func in dir(itertools) if func[0]>=&#39;a&#39;]
  3. >>> len(tools)
  4. 18
  5. >>> tools
  6. [&#39;accumulate&#39;, &#39;chain&#39;, &#39;combinations&#39;, &#39;combinations_with_replacement&#39;, &#39;compress&#39;,
  7. &#39;count&#39;, &#39;cycle&#39;, &#39;dropwhile&#39;, &#39;filterfalse&#39;, &#39;groupby&#39;, &#39;islice&#39;, &#39;permutations&#39;,
  8. &#39;product&#39;, &#39;repeat&#39;, &#39;starmap&#39;, &#39;takewhile&#39;, &#39;tee&#39;, &#39;zip_longest&#39;]
复造代码
1. 乏减器 accumulate 

  1. >>> import itertools as it
  2. >>> it.accumulate(range(11))
  3. <itertools.accumulate object at 0x0A0C9988>
  4. >>> list(it.accumulate(range(11)))
  5. [0, 1, 3, 6, 10, 15, 21, 28, 36, 45, 55]
  6. >>>
复造代码
1乘2乘3...不断乘到n有阶乘运算 n! ,但1减2减3...不断减到n,普通皆出有界说“乏战”运算,借需轮回去计较。如今有了那个函数能够代替用用的,比如1减到100:
  1. >>> list(it.accumulate(range(1+100)))[-1]
  2. 5050
  3. >>>
复造代码
2. 毗连器 chain

毗连多个迭代器,或别的可迭代工具
  1. >>> import itertools as it
  2. >>> it.chain(range(3),[3,4,5],{6,7},(i for i in range(8,11)))
  3. <itertools.chain object at 0x0A0BF3B8>
  4. >>> list(it.chain(range(4),[4,5],{6,7},(i for i in range(8,11))))
  5. [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
  6. >>>
复造代码
3. 组开器 combinations

  1. from itertools import combinations as comb
  2. >>> comb1 = comb(range(4), 3)
  3. >>> list(comb1)
  4. [(0, 1, 2), (0, 1, 3), (0, 2, 3), (1, 2, 3)]
  5. >>> comb2 = comb(range(1,6), 3)
  6. >>> list(comb2)
  7. [(1, 2, 3), (1, 2, 4), (1, 2, 5), (1, 3, 4), (1, 3, 5),
  8. (1, 4, 5), (2, 3, 4), (2, 3, 5), (2, 4, 5), (3, 4, 5)]
  9. >>> comb3 = comb(range(1,6), 4)
  10. >>> list(comb3)
  11. [(1, 2, 3, 4), (1, 2, 3, 5), (1, 2, 4, 5), (1, 3, 4, 5), (2, 3, 4, 5)]
  12. >>>
复造代码
4. 可反复组开器 combinations_with_replacement

  1. >>> from itertools import combinations_with_replacement as Comb2
  2. >>> comb1 = Comb2(range(4), 3)
  3. >>> list(comb1)
  4. [(0, 0, 0), (0, 0, 1), (0, 0, 2), (0, 0, 3), (0, 1, 1), (0, 1, 2), (0, 1, 3),
  5. (0, 2, 2), (0, 2, 3), (0, 3, 3), (1, 1, 1), (1, 1, 2), (1, 1, 3), (1, 2, 2),
  6. (1, 2, 3), (1, 3, 3), (2, 2, 2), (2, 2, 3), (2, 3, 3), (3, 3, 3)]
  7. >>> comb2 = Comb2(range(1,6), 3)
  8. >>> list(comb2)
  9. [(1, 1, 1), (1, 1, 2), (1, 1, 3), (1, 1, 4), (1, 1, 5), (1, 2, 2), (1, 2, 3),
  10. (1, 2, 4), (1, 2, 5), (1, 3, 3), (1, 3, 4), (1, 3, 5), (1, 4, 4), (1, 4, 5),
  11. (1, 5, 5), (2, 2, 2), (2, 2, 3), (2, 2, 4), (2, 2, 5), (2, 3, 3), (2, 3, 4),
  12. (2, 3, 5), (2, 4, 4), (2, 4, 5), (2, 5, 5), (3, 3, 3), (3, 3, 4), (3, 3, 5),
  13. (3, 4, 4), (3, 4, 5), (3, 5, 5), (4, 4, 4), (4, 4, 5), (4, 5, 5), (5, 5, 5)]
  14. >>>
复造代码
5. 布列器 permutations

  1. >>> import itertools as it
  2. >>> list(it.permutations([1,2,3]))
  3. [(1, 2, 3), (1, 3, 2), (2, 1, 3), (2, 3, 1), (3, 1, 2), (3, 2, 1)]
  4. >>> # 数字1、2、3能构成哪些三位数?
  5. >>> [i[0]*100+i[1]*10+i[2] for i in it.permutations([1,2,3])]
  6. [123, 132, 213, 231, 312, 321]
  7. >>>
复造代码
6. 紧缩器 compress

根据实值表去粗简迭代器,挑选出部门值
  1. >>> import itertools as it
  2. >>> i = it.compress(range(6), (1,1,0,0,1,0))
  3. >>> list(i)
  4. [0, 1, 4]
  5. >>>
复造代码
7. 切片器 islice

  1. >>> import itertools as it
  2. >>> islice = it.islice(range(100),0,9,2)
  3. >>> list(islice)
  4. [0, 2, 4, 6, 8]
  5. >>> iSlice = it.islice(range(1,100),0,9,2)
  6. >>> list(iSlice)
  7. [1, 3, 5, 7, 9]
  8. >>> # 能够没有指定肇端战步少,间接指定个数
  9. >>> list(it.islice(range(1,100),10))
  10. [1, 11, 21, 31, 41, 51, 61, 71, 81, 91]
  11. >>>
复造代码
8. 计数器 count

由于天生器只供给道法没有是数据散,间接用 list(count1)会逝世轮回的,能够用islice()指定一下个数。
  1. >>> import itertools as it
  2. >>> count1 = it.count(start=0,step=3)
  3. >>> list(it.islice(count1,12))
  4. [0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33]
  5. >>> count2 = it.count(start=100,step=-2)
  6. >>> list(it.islice(count2,10))
  7. [100, 98, 96, 94, 92, 90, 88, 86, 84, 82]
  8. >>>
复造代码
9. 轮回器 cycle

  1. >>> import itertools as it
  2. >>> list(it.islice(it.cycle(&#39;ABC&#39;),10))
  3. [&#39;A&#39;, &#39;B&#39;, &#39;C&#39;, &#39;A&#39;, &#39;B&#39;, &#39;C&#39;, &#39;A&#39;, &#39;B&#39;, &#39;C&#39;, &#39;A&#39;]
  4. >>> list(it.islice(it.cycle([1,2,3,4]),10))
  5. [1, 2, 3, 4, 1, 2, 3, 4, 1, 2]
  6. >>>
复造代码
10. 反复器 repeat

  1. >>> import itertools as it
  2. >>> list(it.repeat(5,10))
  3. [5, 5, 5, 5, 5, 5, 5, 5, 5, 5]
  4. >>> list(it.repeat([1,2],5))
  5. [[1, 2], [1, 2], [1, 2], [1, 2], [1, 2]]
  6. >>>
复造代码
11. 舍实器 dropwhile

舍弃没有满意前提的元素,但当前提没有满意即避免挑选
  1. >>> import itertools as it
  2. >>> lst = [1,3,5,2,4,6,10,11,7,8,12,15]
  3. >>> list(it.dropwhile(lambda i:i<9,lst))
  4. [10, 11, 7, 8, 12, 15]
  5. >>> list(it.dropwhile(lambda i:i%2,lst))
  6. [2, 4, 6, 10, 11, 7, 8, 12, 15]
  7. >>>
复造代码
12. 留实器 takewhile

留下满意前提的元素,但当前提没有满意即避免挑选
  1. >>> import itertools as it
  2. >>> list(it.takewhile(lambda i:i<6, range(10)))
  3. [0, 1, 2, 3, 4, 5]
  4. >>> lst = [1,3,5,2,4,6,10,11,7,8,12,15]
  5. >>> list(it.takewhile(lambda i:i<11,lst))
  6. [1, 3, 5, 2, 4, 6, 10]
  7. >>> list(it.takewhile(lambda i:i%6,lst))
  8. [1, 3, 5, 2, 4]
  9. >>>
复造代码
13. 筛假器 filterfalse

舍弃满意前提的一切元素,留下一切没有满意前提的
  1. >>> import itertools as it
  2. >>> lst = [1,3,5,2,4,6,10,11,7,8,12,15]
  3. >>> list(it.filterfalse(lambda i:i<9,lst))
  4. [10, 11, 12, 15]
  5. >>> list(it.filterfalse(lambda i:i%2,lst))
  6. [2, 4, 6, 10, 8, 12]
  7. >>>
复造代码
14. 分组器 groupby

  1. >>> import itertools as it
  2. >>> group = it.groupby(range(20), lambda i:not 8<i<16)
  3. >>> for i,j in group: print(i,list(j))
  4. True [0, 1, 2, 3, 4, 5, 6, 7, 8]
  5. False [9, 10, 11, 12, 13, 14, 15]
  6. True [16, 17, 18, 19]
  7. >>>
复造代码
15. 乘积器 product

  1. >>> import itertools as it
  2. >>> list(it.product(&#39;ABC&#39;,(1,2)))
  3. [(&#39;A&#39;, 1), (&#39;A&#39;, 2), (&#39;B&#39;, 1), (&#39;B&#39;, 2), (&#39;C&#39;, 1), (&#39;C&#39;, 2)]
复造代码
16. 映照器 starmap

  1. >>> import itertools as it
  2. >>> list(it.starmap(str.isupper, &#39;AbCDefgH&#39;))
  3. [True, False, True, True, False, False, False, True]
  4. >>> list(it.starmap(lambda a,b,c:a+b+c,([1,2,3],[4,5,6],[7,8,9])))
  5. [6, 15, 24]
  6. >>> list(it.starmap(lambda *a:sum(a),[range(5),range(10),range(101)]))
  7. [10, 45, 5050]
  8. >>>
复造代码
17. 元组器 tee

返回多个迭代器的元组
  1. >>> import itertools as it
  2. >>> [list(i) for i in it.tee([1,2,3],3)]
  3. [[1, 2, 3], [1, 2, 3], [1, 2, 3]]
  4. >>> it.tee([1,2,3],3)
  5. (<itertools._tee object at 0x030711A8>,
  6. <itertools._tee object at 0x03078228>,
  7. <itertools._tee object at 0x0131FFE8>)
  8. >>>
复造代码
18. 挨包器 zip_longest

取内乱置函数zip()相似,但元素个数以最少的迭代器为准
  1. >>> import itertools as it
  2. >>> list(it.zip_longest(&#39;ABCDE&#39;,range(1,4)))
  3. [(&#39;A&#39;, 1), (&#39;B&#39;, 2), (&#39;C&#39;, 3), (&#39;D&#39;, None), (&#39;E&#39;, None)]
  4. >>> list(zip(&#39;ABCDE&#39;,range(1,4)))
  5. [(&#39;A&#39;, 1), (&#39;B&#39;, 2), (&#39;C&#39;, 3)]
  6. >>> list(it.zip_longest(&#39;ABCDE&#39;,range(1,4),[1,2,3,4]))
  7. [(&#39;A&#39;, 1, 1), (&#39;B&#39;, 2, 2), (&#39;C&#39;, 3, 3), (&#39;D&#39;, None, 4), (&#39;E&#39;, None, None)]
  8. >>>
复造代码
名字我随意起的,形像便好。看下去如何?十八刀兵,样样夺目了吗?实在把握个几样“称脚的”便可,何须八面玲珑呢 ^_^

免责声明:假如进犯了您的权益,请联络站少,我们会实时删除侵权内乱容,感谢协作!
1、本网站属于个人的非赢利性网站,转载的文章遵循原作者的版权声明,如果原文没有版权声明,按照目前互联网开放的原则,我们将在不通知作者的情况下,转载文章;如果原文明确注明“禁止转载”,我们一定不会转载。如果我们转载的文章不符合作者的版权声明或者作者不想让我们转载您的文章的话,请您发送邮箱:Cdnjson@163.com提供相关证明,我们将积极配合您!
2、本网站转载文章仅为传播更多信息之目的,凡在本网站出现的信息,均仅供参考。本网站将尽力确保所提供信息的准确性及可靠性,但不保证信息的正确性和完整性,且不对因信息的不正确或遗漏导致的任何损失或损害承担责任。
3、任何透过本网站网页而链接及得到的资讯、产品及服务,本网站概不负责,亦不负任何法律责任。
4、本网站所刊发、转载的文章,其版权均归原作者所有,如其他媒体、网站或个人从本网下载使用,请在转载有关文章时务必尊重该文章的著作权,保留本网注明的“稿件来源”,并自负版权等法律责任。
回复 关闭延时

使用道具 举报

 
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则