为什么我的代码中有两个不同版本的列表?

时间:2015-03-14 18:36:32

标签: python python-2.7

我正在将文件解析到内存,编辑它,删除多个条目,换行符等,然后将其写入新文件。

但由于某种原因,行mystatement = parsedoc[i]==parsedoc[j]始终返回false。它应该检查接下来的20个可用行(没有到达列表之外),如果它们匹配,它应该删除它。但是,当我执行print parsedoc[i],parsedoc[j]时,parsedoc[j]在结尾处仍然有新行,该行应在前一行中删除,并且也不会显示在parsedoc[i]中。我可以重新安排我的代码以避免这种情况,但为什么会这样呢?

代码:

#print "What file would you like to open?" #comment this and the next line back in
filename = "97_03_10.log" #raw_input("? ")

f = open(filename,'r')
filelines = f.readlines()
filedata = [len(filelines)]
parsedoc = []

del f

for line in filelines:
   parsedoc.append(line.split("\t")[1:])

#del filelines

for i in range(20):#len(parsedoc)-1): #this is where the magic happens
   if (not parsedoc[i]):
      print True
      continue

   parsedoc[i][1] = parsedoc[i][1].replace("\n","")
   if (parsedoc[i][1]==""):#remove empty entries
      parsedoc[i] = []
      continue

   for j in range(i+1,i+(20 if (20+i<len(parsedoc)) else (len(parsedoc)-i-1))):
      mystatement = parsedoc[i]==parsedoc[j]
      print parsedoc[i],parsedoc[j]
      if mystatement:
         parsedoc[j] = []

#for line in parsedoc:
#   print line

parsedoc = filter(None,parsedoc)

filedata.append(len(parsedoc))

print "Originally",
print filedata[0],
print "lines."
print "Currently",
print filedata[1],
print "lines."

for line in parsedoc[:20]:
   print line

输出:只是抬头,这些是原生搜索结果。如果你拿走每个人的搜索结果并编译它们,就会有咒骂的话和通常的嫌疑。

http://pastebin.com/KBMudX7f

我的输入文件的前40行,用于测试:再次,有咒骂词和其他不良词。 NSFW。

http://pastebin.com/AgxnBMtF

1 个答案:

答案 0 :(得分:3)

您在第i个元素中删除循环内的换行符,并且ji+1开始,当您比较索引{{1}处的元素时}和i,一个人将被剥夺,一个人不会。

j的初始化更改为:

parsedoc

for line in filelines: parsedoc.append(line.strip().split("\t")[1:]) / for i循环之前,将从每一行中删除换行符。

这也意味着您可以摆脱for j

通过此编辑,您将获得:

Originally 49 lines.
Currently 44 lines.

修改:您可以使用csv包重新编写代码:

parsedoc[i][1] = parsedoc[i][1].replace("\n","")