我有一个文本文件,每行上都有型号(每个7个字符)。 该文件长约30,000行。
我试图只挑选出具有重复条目的模型,但是当我运行此代码时,Python崩溃(冻结,没有响应)。我还需要知道重复项在哪些行上。
uniqueList = []
dupList = []
termList = open("terIDtest2.txt").readlines()
i = 0
for i in range(len(termList)):
line = termList[i].split()
if line not in uniqueList:
uniqueList.append(line)
else:
dupList.append(line)
i += 1
print (dupList)
文本文件的前5行是:
FL0881
IL1695
CA0496
NY4459
NJ0203
阅读评论后,我尝试了此操作:
termList = open("terIDtest2.txt")
i = 1
for line in termList:
line.strip("\n")
if line in errorDict:
errorDict[line].append(i)
else:
errorDict[line] = [i]
i += 1
for i, n in errorDict.items():
print (str(i) + str(n))
仍然无法完成运行。
答案 0 :(得分:1)
您实际上不需要存储每个重复项;存储一个副本以及行号就足够了。
import collections
occurrences = collections.defaultdict(list)
with open("terIDtest2.txt") as f:
for line_number, line in enumerate(f):
occurrences[line.strip()].append(line_number)
unique_list = [(s, lines[0]) for s, lines in occurrences.items() if len(lines) == 1]
duplicate_list = [(s, lines[1:]) for s, lines in occurrences.items() if len(lines) > 1]
或
unique_list = []
duplicate_list = []
for s, lines in occurrences.items():
if len(lines) == 1:
unique_list.append((s, lines[0]))
else:
duplicate_list.append((s, lines[1:]))
重复项是lines
的那些元素,其列表包含多个元素。第一个唯一出现在该列表的第一个元素上。
如果您需要lines
中第一次出现重复项的行号,也可以使用lines[1:]
代替duplicate_list
。
答案 1 :(得分:0)
这是我使用defaultdict
from collections import defaultdict
d=defaultdict(int)
with open('C:/d2','r') as readObject:
for line in readObject:
line=line.rstrip('\n')
d[line] +=1
print(d)
重复项
for (k,v) in d.items():
if(v>1):
print(k,v)
独特
for (k,v) in d.items():
if(v==1):
print(k,v)
数据
FL0881
IL1695
CA0496
NY4459
NJ0203
NY4459
NJ0203
FL0881
FL0881
FL0881
FL0881
FL0881
FL9999
重复项
FL0881 6
NY4459 2
NJ0203 2
独特
IL1695 1
CA0496 1
FL9999 1
*由于行号从0开始,因此您可能需要调整行号。
d1=defaultdict(list)
lineNumner=1
with open('C:/random/d2','r') as readObject:
for line in readObject:
line=line.rstrip('\n')
d1[line].append(lineNumner)
lineNumner +=1
for (k,v) in d1.items():
if (len(v) >1):
print('Duplicated for {} happnes at lines: {}'.format(k,v))
结果
Duplicated for FL0881 happnes at lines: [1, 8, 9, 10, 11, 12]
Duplicated for NY4459 happnes at lines: [4, 6]
Duplicated for NJ0203 happnes at lines: [5, 7]