我需要打印输出,其中仅拆分1个列表且不重复。我正在使用的列表有100k电子邮件和1000x重复。我要删除那些..
我尝试了一些我在网上看过的东西
但是我的新文件中什么都没有写,并且pycharm在运行时冻结了
def uniquelines(lineslist):
unique = {}
result = []
for item in lineslist:
if item.strip() in unique: continue
unique[item.strip()] = 1
result.append(item)
return result
file1 = open("wordlist.txt","r")
filelines = file1.readlines()
file1.close()
output = open("wordlist_unique.txt","w")
output.writelines(uniquelines(filelines))
output.close()
我希望它只打印所有电子邮件,而不会重复到新的文本文件中
答案 0 :(得分:1)
在我找到希望解决该问题的几种方法之前,我发现最主要的一件事是您在函数中同时使用了字典和列表。这几乎使处理事情所需的内存增加了一倍。我建议使用其中一个。
使用set
将为您提供唯一项目的保证“列表”。 set.add()
函数将忽略重复项。
s = {1, 2, 3}
print(s) #{1, 2, 3}
s.add(4)
print(s) #{1, 2, 3, 4}
s.add(4)
print(s) #{1, 2, 3, 4}
这样,您可以将函数修改为以下内容,以实现所需的功能。在我的示例中,我将input.txt
作为一系列行,仅包含一个整数值和大量重复项。
def uniquelines(lineslist):
unique = set()
for line in lineslist:
unique.add(str(line).strip())
return list(unique)
with open('input.txt', 'r') as f:
lines = f.readlines()
output = uniquelines(lines)
with open('output.txt', 'w') as f:
f.write("\n".join([i for i in output]))
output.txt
如下,没有重复!
2
0
4
5
3
1
9
6
您可以通过在列表理解中调用set()
来完成相同的操作,但是这里的缺点是您需要先将所有记录加载到内存中,然后再取出重复记录。上面的方法将保留所有唯一值,但不包含重复值,因此您可能要使用该函数。
with open('input.txt', 'r') as f:
lines = f.readlines()
output = set([l.strip() for l in lines])
with open('output.txt', 'w') as f:
f.write("\n".join([i for i in output]))
我不太清楚您是否希望保持每个唯一行出现次数的连续计数。如果您要这样做,则可以使用in
运算符查看它是否已经在键中。
def uniquelines(lineslist):
unique = {}
for line in lineslist:
line = line.strip()
if line in unique:
unique[line] += 1
else:
unique[line] = 1
return unique
# {'9': 2, '0': 3, '4': 3, '1': 1, '3': 4, '2': 1, '6': 3, '5': 1}