Python 迭代器 的问题。。纠结。。

以手指天 发布于 2012/08/07 14:42
阅读 727
收藏 0

最近发现用(x for x in list)返回的生成器,比列表推导快100倍以上。。因为数据大,所以选择使用返回迭代器来过滤数据,结果遇到问题,下面是模拟的情况:

说明:这个功能用来从数据中过滤符合条件的数据,并返回结果,试过了列表推导,过滤器filter,速度都太慢了,这里就讨论是什么原因导致结果不一样的

#coding=utf-8
'''
Created on 2012-7-18

@author : bailiangjun
'''



def Test1(searchData, condition):
    
    for key, value in condition.items():
        searchData = (item for item in searchData if item.get(key) in value)
    return searchData

def Test2(searchData, condition):
    for key, value in condition.items():
        searchData = ConditionFilter(searchData, key, value)
    return searchData

def ConditionFilter(searchData, key, value):
    return (item for item in searchData if item.get(key) in value)

if __name__ == '__main__':
    """
    @attention : 从searchData中过滤出同时符合条件condition的数据,例如这个例子就是找出a在[1]里面,b在[5]里面的那一条数据
    """
    searchData = [
              {"a":1, "b":1, "c":3},
              {"a":1, "b":2, "c":3},
              {"a":1, "b":3, "c":3},
              {"a":2, "b":1, "c":3},
              {"a":2, "b":2, "c":3},
              {"a":2, "b":3, "c":3},
            ]

    condition = {"a":[1], "b":[2]}
    print list(Test1(searchData, condition))
    print list(Test2(searchData, condition))

方法Test1依然返回的是新的生成器,为什么会和test2不一样呢?  求高手解释

加载中
0
zcfrank1st
zcfrank1st

你仔细看看,Test1函数中是只判断item.get(key) in value,也就是说主要满足get的值在value中就可以了,也就是满足值为1或2就可以的。而Test2函数中又调用函数ConditionFilter,此时无形中又把key值传递了一下,所以调用Test2的结果是正确的。

返回顶部
顶部