Python 循环遍历一个生成器函数,该函数遍历两个非常大的列表

Python 循环遍历一个生成器函数,该函数遍历两个非常大的列表,python,list,generator,Python,List,Generator,我有两个非常大的列表,它们的大小是动态的,不为人所知,因为它们来自不同的来源,每个子列表都有2000个条目 我需要遍历两个列表的每个子列表,并将其传递给sql查询,进行一些数据处理,然后转到下一个子列表 使用生成器是遍历如此庞大的列表的理想选择 为了简化,我使用两个列表重新创建了这个问题,每个列表有10个条目,每个子列表有2个条目 def test(): Send_list= [['2000000000259140093', '1000000000057967562']

我有两个非常大的列表,它们的大小是动态的,不为人所知,因为它们来自不同的来源,每个子列表都有2000个条目

我需要遍历两个列表的每个子列表,并将其传递给sql查询,进行一些数据处理,然后转到下一个子列表

使用生成器是遍历如此庞大的列表的理想选择

为了简化,我使用两个列表重新创建了这个问题,每个列表有10个条目,每个子列表有2个条目

    def test():
         Send_list= [['2000000000259140093', '1000000000057967562'],
                     ['4000000000008393617', '3000000000006545639'],
                     ['1000000000080880314','1000000000119225203'],
                     ['1000000000096861508', '1000000000254915223'],
                     ['2000000000079125911', '1000000000014797506']]
         Pay_list = [['3000000000020597219', '1000000000079442325'],
                     ['1000000000057621671', '3000000000020542928'],
                     ['3000000000020531804', '4000000000010435913'],
                     ['1000000000330634222', '3000000000002353220'],
                     ['1000000000256385361', '2000000000286618770']]
         for list1,list2 in itertools.izip_longest(Send_list,Pay_list):
               yield [list1,list2]
现在,我可以使用next()函数逐段迭代,并将子列表传递给sql查询

    In [124]: c = next(test())

In [125]: c
Out[125]:
[['2000000000259140093', '1000000000057967562'],
 ['3000000000020597219', '1000000000079442325']]

a = c[0]
b = c[1]
placeholders1 = ','.join('?' for i in range(len(a)))
placeholders2 = ','.join('?' for i in range(len(b)))
sql1 = "select * from Pretty_Txns where Send_Customer in (%s)"% placeholders1
sql2 = "select * from Pretty_Txns where pay_Customer in (%s)"% placeholders2
df_send = pd.read_sql(sql1,cnx,params=a)
df_pay = pd.read_sql(sql2,cnx,params=b)
///data processing and passing the result frame back to sql///
result.to_sql()
///then repeating the same steps for the the next sublists
现在,当我尝试使用for循环在next()中循环时:

   for list in test():
        c = next(test())
        a = c[0]
        b = c[1]
        placeholders1 = ','.join('?' for i in range(len(a)))
        placeholders2 = ','.join('?' for i in range(len(b)))
        sql1 = "select * from Pretty_Txns where Send_Customer in (%s)"% placeholders1
        sql2 = "select * from Pretty_Txns where pay_Customer in (%s)"% placeholders2
        df_send = pd.read_sql(sql1,cnx,params=a)
        df_pay = pd.read_sql(sql2,cnx,params=b)
       ////lot of data processing steps and passing the final results back to sql
        result.to_sql()
它只遍历前两个子列表,并对其进行处理,然后停止

现在c的值是:

In [145]: c
Out[145]:
[['2000000000259140093', '1000000000057967562'],
 ['3000000000020597219', '1000000000079442325']]
这是发送列表支付列表中的第一个子列表

    In [149]: Send_list
Out[149]:
[['2000000000259140093', '1000000000057967562'],
 ['4000000000008393617', '3000000000006545639'],
 ['1000000000080880314', '1000000000119225203'],
 ['1000000000096861508', '1000000000254915223'],
 ['2000000000079125911', '1000000000014797506']]

In [150]: Pay_list
Out[150]:
[['3000000000020597219', '1000000000079442325'],
 ['1000000000057621671', '3000000000020542928'],
 ['3000000000020531804', '4000000000010435913'],
 ['1000000000330634222', '3000000000002353220'],
 ['1000000000256385361', '2000000000286618770']]
一旦结果数据帧中的数据传递给sql,控件应返回步骤c=next(test()),整个过程应重复,直到原始列表用尽


我正在努力实现这一目标。期待一些提示和指导。

首先,我不明白为什么要将
for
循环与显式调用
next
混合在一起

其次,
next(test())
for
循环的每次迭代中对新的生成器对象调用
next
,这意味着
c
将始终是gen.对象的第一项。您可能需要将同一个gen.对象存储在某个位置,然后对其重复调用
next

gen = test()
c = next(gen)
...
c = next(gen)
最后,
itertools.izip_longest
返回一个迭代器,因此您可能因为从中产生值而使事情变得复杂。您可以简单地返回迭代器

def test():
     ...
     return itertools.izip_longest(Send_list, Pay_list):

首先,我不明白为什么要混合使用
for
循环和显式调用
next

其次,
next(test())
在新生成器对象上调用
next
在每次迭代
for
循环时,这意味着,
c
将始终是gen.object中的第一项。您可能需要将同一个gen.对象存储在某个位置,然后对其重复调用
next

gen = test()
c = next(gen)
...
c = next(gen)
最后,
itertools.izip_longest
返回一个迭代器,因此您可能因为从中产生值而使事情变得复杂。您可以简单地返回迭代器

def test():
     ...
     return itertools.izip_longest(Send_list, Pay_list):

好吧,不要总是创建一个新的生成器,只使用它的第一个元素。创建一个
生成器并进行迭代

>>> for a, b in test():
        print a, b

['2000000000259140093', '1000000000057967562'] ['3000000000020597219', '1000000000079442325']
['4000000000008393617', '3000000000006545639'] ['1000000000057621671', '3000000000020542928']
['1000000000080880314', '1000000000119225203'] ['3000000000020531804', '4000000000010435913']
['1000000000096861508', '1000000000254915223'] ['1000000000330634222', '3000000000002353220']
['2000000000079125911', '1000000000014797506'] ['1000000000256385361', '2000000000286618770']

好吧,不要总是创建一个新的生成器,只使用它的第一个元素。创建一个生成器并进行迭代

>>> for a, b in test():
        print a, b

['2000000000259140093', '1000000000057967562'] ['3000000000020597219', '1000000000079442325']
['4000000000008393617', '3000000000006545639'] ['1000000000057621671', '3000000000020542928']
['1000000000080880314', '1000000000119225203'] ['3000000000020531804', '4000000000010435913']
['1000000000096861508', '1000000000254915223'] ['1000000000330634222', '3000000000002353220']
['2000000000079125911', '1000000000014797506'] ['1000000000256385361', '2000000000286618770']

我不能每次都输入c=next(test()),所以我想使用for循环。@optimus\u prime那么for循环就足够了。您不需要
next
Yes。我现在明白了。谢谢。我不能每次都输入c=next(test()),所以我想使用for循环。@optimus\u prime那么for循环就足够了。您不需要
next
Yes。我现在明白了。谢谢