如何在Python中使用嵌套循环
有人能帮我解决这个嵌套循环的问题吗?它和循环不工作 - 字符串(Python)的问题一样,不过现在是在一个没有csv.readline()函数的csv类里面。
import csv
import sys, re
import codecs
reload(sys)
sys.setdefaultencoding('utf-8')
reader = csv.reader(open("reference.txt"), delimiter = "\t")
reader2 = csv.reader(open("current.txt"), delimiter = "\t")
for line in reader:
for line2 in reader2:
if line[0] == line2[1]:
print line2[0] + '\t' + line[0]
print line[1]
else:
print line[0]
print line[1]
这段代码的目的是检查一个参考文本(也就是reader2)中的行,看看哪些和当前的文本文件(也就是reader)相符。然后打印出在reference.txt中的序列号。
reference.txt的内容大概是这样的(序列号和句子之间有一个tab
):
S00001LP this is a nested problem
S00002LP that cannot be solved
S00003LP and it's pissing me off
S00004LP badly
current.txt的内容大概是这样的(第一句和第二句之间有一个空格):
this is a nested problem wakaraa pii ney bay tam
and i really can't solve it shuu ipp faa luiip
so i come to seek help from stackoverflow lakjsd sdiiije
seriously it is crazy because such foo bar bar foo
problems don't happen in other languages whaloemver ahjd
and it's pissing me off gaga ooo mama
badly wahahahah
所需的输出结果大概是这样的:
S00001LP this is a nested problem wakaraa pii ney bay tam
and i really can't solve it shuu ipp faa luiip
so i come to seek help from stackoverflow lakjsd sdiiije
seriously it is crazy because such foo bar bar foo
problems don't happen in other languages whaloemver ahjd
S00003LP and it's pissing me off gaga ooo mama
S00004LP badly wahahahah
2 个回答
4
一种方法是创建一个字典,把你的键和序列号对应起来:
serials = dict(map(reversed, reader))
for line in reader2:
serial = serials.get(line[0])
if serial is not None:
print serial
这样做会比用嵌套循环快得多。
第一行代码创建了一个字典,把键和序列号进行映射。因为字典的构造函数需要的是一对对的(键,值),而你的文件实际上是(值,键)这样的格式,所以我们需要把每条记录中的两个部分调换一下位置——这就是map(reversed, ...)
的作用。
6
你只能从一个流中读取一次。你的内层循环读取第二个文件的速度太快了,导致外层循环的其他部分没有机会再次读取第二个文件。
试着把这个:
reader = csv.reader(open("reference.txt"), delimiter = "\t")
reader2 = csv.reader(open("current.txt"), delimiter = "\t")
改成这个:
reader = list(csv.reader(open("reference.txt"), delimiter = "\t"))
reader2 = list(csv.reader(open("current.txt"), delimiter = "\t"))
使用 list()
可以一次性读取整个文件,把它变成一个在内存中的列表,这样你就可以随意遍历这个列表多次。
更好的方法是把你的参考数据存储在一个字典里,这样就不需要为每一行数据都去循环一遍了。