我有一个.txt文件的IP,时间,搜索查询和网站访问。我使用for循环将它们分解为列表的相应索引,然后将所有这些列表放入更大的列表中。
打印时可能看起来像......
['4.16.159.114', '08:13:37', 'french-english dictionary', 'humanities.uchicago.edu/forms_unrest/FR-ENG.html\n']
['4.16.186.203', '00:13:54', 's.e.t.i.', 'www.seti.net/\n']
['4.16.189.59', '05:48:58', 'which is better http upload or ftp upload', 'www.ewebtribe.com/htmlhelp/uploading.htm\n']
['4.16.189.59', '06:50:49', 'cgi perl tutorial', 'www.cgi101.com/class/\n']
['4.16.189.59', '07:16:28', 'cgi perl tutorial', 'www.free-ed.net/fr03/lfc/course%20030207_01/\n']
我到达这里的代码看起来是这样的,这只是我从文本文件中抓取这些数据,并将其放入列表,然后写入另一个文本文件。
import io
f = io.open(r'C:\Users\Ryan Asher\Desktop\%23AlltheWeb_2001.txt', encoding="Latin-1")
p = io.open(r'C:\Users\Ryan Asher\Desktop\workfile.txt', 'w')
sweet = []
for line in f:
x = line.split(" ")
lbreak = x[0].split("\t")
sweet.append(lbreak)
for item in sweet:
p.write("%s\n" % item)
我的问题是每个列表中的第3个索引,在甜蜜列表或[2]中,这是搜索查询(法语 - 英语词典,s.e.t.i等)。我不想在'甜蜜'名单中加倍。
所以它说'cgi perl tutorial'但两次,我需要摆脱'cgi perl tutorial'的其他搜索,只留下第一个,在甜蜜列表中。
我不能使用set这个我不认为,因为我只想将它应用于搜索查询的第3个索引,我不希望它摆脱相同IP的重复,或者其中一个。
答案 0 :(得分:3)
将lbreak[2]
添加到一个集合中,只追加lbreak[2]
不在集合中的行,例如:
sweet = []
seen = set()
for line in f:
x = line.split(" ")
lbreak = x[0].split("\t")
if lbreak[2] not in seen:
sweet.append(lbreak)
seen.add(lbreak[2])
答案 1 :(得分:1)
使用dict,将查询作为键,将整个列表作为值。像这样(未经测试):
sweet = {}
for line in f:
...
query = lbreak[2]
if query not in sweet:
sweet[query] = lbreak
如果您想要每个查询的最后一个实例而不是第一个,那么您可能会失去if
,并无条件地执行任务。