3 回答
TA贡献1815条经验 获得超13个赞
问题恰恰是它所说的:文件对象不知道如何计数。它们只是迭代器,而不是列表或字符串之类的东西。
造成这种情况的部分原因是,一遍又一遍地扫描整个文件可能会非常缓慢。
如果你真的需要使用count,你可以先把这些行放到一个列表中。列表是完全在内存中的,因此一遍又一遍地扫描列表并没有那么慢,并且列表有一种count方法可以完全满足您的要求:
datafile = open ("Duplicate.txt", "r")
lines = list(datafile)
for i in lines:
if lines.count(i) >= 2:
newList.add(i)
datafile.close()
但是,有一个更好的解决方案:只需在进行时保持计数,然后保留 >= 2 的计数。实际上,您可以将其写成两行:
counts = collections.Counter(datafile)
newList = {line for line, count in counts.items() if count >= 2}
但是,如果您不清楚为什么这样做,您可能希望更明确地进行操作:
counts = collections.Counter()
for i in datafile:
counts[i] += 1
newList = set()
for line, count in counts.items():
if count >= 2:
newList.add(line)
或者,如果您甚至不了解以下内容的基础知识Counter:
counts = {}
for i in datafile:
if i not in counts:
counts[i] = 1
else:
counts[i] += 1
TA贡献1898条经验 获得超8个赞
您代码中的错误正在尝试应用count到文件句柄,而不是list。
无论如何,您不需要计数元素,只需要查看文件中是否已经存在该元素。
我建议使用一个标记集,以记下已经发生了哪些元素。
seen = set()
result = set()
with open ("Duplicate.txt", "r") as datafile:
for i in datafile:
# you may turn i to a number here with: i = int(i)
if i in seen:
result.add(i) # data is already in seen: duplicate
else:
seen.add(i) # next time it occurs, we'll detect it
print(list(result)) # convert to list (maybe not needed, set is ok to print)
添加回答
举报