学习资料来自于ring翻译的python cook book.源贴于linuxforum ,此处只是记录我自己的一点理解

拉平一个嵌套的序列

应用迭带器和生成器

原文的例子有点问题。原文中应用iter(obj) 来判断是否能够继续loop,但是对于’a’这样即使只有一个字符的字符串iter仍然可以生成迭带,另外对于单字符也判断成isstringlike造成逻辑上的混乱,因此做了一定的改动。但感觉不是太好。

#coding=cp936
 def flatten(sequence,scalarp):
     for item in sequence:
         if scalarp(item)!=1:
             yield item
         else:
             for subitem in flatten(item,scalarp):
                 yield subitem
 
 def canLoopOver(maybeIterable):
     try:
         iter(maybeIterable)
     except:
         return 0
     else:
         return 1
 
 def isStringLike(obj):
     try:
         obj+''
     except :
         return 0
     else:
         if len(obj)==1 :return 2
         return 1
 
 def isScalar(obj):
     if isStringLike(obj)==0:
         if canLoopOver(obj)==1:
             return 1
         else:
             return 0
     elif isStringLike(obj)==2:return 0
     else:
         return 1
 
 a=[[1,2,3],2,3,'yes',4,[5,6,7,[1,2]],3,'hello',u'中文']
 f=flatten(a,scalarp=isScalar)
 b=[]
 while 1:
     try:
         b.append(f.next())
     except:
         break
 print b

 

[1, 2, 3, 2, 3, 'y', 'e', 's', 4, 5, 6,
7, 1, 2, 3, 'h', 'e', 'l', 'l', 'o', u'\u4e2d', u'\u6587']

 

在索引和序列元素上并行循环

几种方法的效率都差不太多。

indices =
xrange(sys.maxint)  #xrange
不直接创建列表 另外还可以使用xzip

seq=[‘a’,’hello’,’good’]

1:

for item, index in zip ( seq , indices ):

    something(item, index)

2:

    for index in range(len(seq)):

        somethine(seq[index],index)

3:

    class indexed:

        def __init__(self, seq):

            self.seq=seq

        def __getitem__(self,i):

            return self.seq[i], i

    i=indexed(seq)

    for item,index in i(seq):

        something(item,index)

4:

    def indexed(seq):

        iterator=iter(seq)

        for index in indices:

            yield iterator.next() , index

    for item, index in indexed(seq):

        something(item,index)


2条评论

  1. 判断是否是 StringLike 可以用

    isinstance(obj,str)

  2. 本来自作聪明,认为用isinstance(obj,str)就可以判断 stringlike.后来才发现,既然是stringlike 包括unicode或者其他从 unicdoe str 等继承的子类都具有相同的字符特性。如果只用 isinstance来判断是不行的。所以还是原来程序中的方法更具有通用性。

发表评论

评论也有版权!