2011-11-11 34 views
-3

很简单为什么会这样:for循环

for i in reader: 
     for j in empsTbl: 
      if i[0] == j.inmptl_wiw_userid: 
       print "Match" 

打印超过500个结果

这:

for i in empsTbl: 
     for j in reader: 
      if j[0] == i.inmptl_wiw_userid: 
       print "Match" 

打印没有结果?

+5

这不能回答不知道什么* *确切的reader''价值观和'empsTbl'是每个循环执行的时间。 'i'和'j'对于不是整数索引的循环变量来说也不是很好的名字。 – millimoose

+0

阅读器是一个csv阅读器,它有大约500行,如果自行打印,它们将全部打印出来。 empsTbl是一个具有700行的oracle数据库表,如果自行打印,它们将全部打印出来。第一块代码实际上打印了500多次。 – JackalopeZero

回答

8

看起来像你的reader是一个发生器,它只能读取一次。也许是文件阅读器?

在第一种情况下,您只读取一次,并将每个值与empsTbl的所有元素进行比较,这显然是列表(或者元组或字典,即可以根据需要读取)。

在第二种情况下,当您在empsTbl的第一项(显然不匹配它,如果没有打印任何内容)时完全读取它,然后使用empsTbl的第二项,则不能再次读取它(即文件是通读)。

UPDATE:随着此数目的记录,你可以将所有内容复制到其可以重复一遍又一遍Python列表(套/词典会甚至可能更好,因为他们为您提供更快的查找时间)

也许是这样的:

readerSet = set(i[0] for i in reader) 

for j in empsTbl: 
    if j.inmptl_wiw_userid in readerSet: 
     print "Match" 
0

要回答这个问题,我们确实需要更多地了解什么readerempsTbl是。但想到的一个可能性是reader是一个发电机。在这种情况下,在内部循环迭代它不起作用,因为生成器在外部循环的第一次迭代中耗尽,留下内部循环为空,我是外部循环的所有后续迭代。

0

如果empsTblreader是不同的列表,并且包含不同类型的元素,那么j[0]i[0]应该很可能是不同的东西。

这应该解释不同,就像“混合橙子和苹果”的老故事。

当然不过,这只是答案的一部分,因为我们只能看到问题的一部分; O)