separator = " "
aSet = set()
with open('myfile', 'rU') as infile:
for line in infile:
tempLine = line.split(separator)
tempLine = tempLine[1:2] + tempLine[0:1] + tempLine[2:]
tempLine = separator.join(tempLine)
if line not in aSet and tempLine not in aSet:
aSet.add(line)
visited = set() # use set for faster lookups
with open(out_filename, "w") as outfile:
with open(in_filename, "r") as infile:
for line in infile:
x = line.split()
k = (tuple(sorted(x[:2])), tuple(x[2:]))
if k not in visited:
outfile.write(line)
visited.add(k)
现在,}是否被交换。在
aSet
包含唯一的行列表,不管entry_1
和{编辑:如果所有条目都可以交换,并且行仍然被认为是唯一的,则:
^{pr2}$一个合适的解决方案将取决于您有哪些约束以及需要多长时间运行此操作。在
如果这是一个一次性(或不经常)的操作,并且内存使用不是一个大问题,那么这样做就足够了:
内存使用量取决于我们需要在^{中跟踪的唯一条目的数量。如果没有太多的重复项,那么几乎所有的数据都在内存中。在
如果内存使用成为一个问题,可以分多个阶段进行:
步骤2&3可以合并,因为在执行排序时比较条目时可以简单地丢弃重复项。在
如果您不介意使用shell,可以使用
sort -u yourfile
完成步骤2和3。在请注意,这会更改文件中行的顺序(您提到的不是问题)。在
为了大幅减少内存使用量以牺牲某些性能为代价,可以使用基于文件的数据库来存储和查找访问过的条目(代替
set()
)。在您可以通过在内存中存储条目的哈希来加快速度,并且只在哈希匹配时查询数据库,以确认条目是否确实相同。散列可以很简单,比如获取每个条目的第一个字符,或者使用内置的
hash()
函数,或者选择一个existing hash algorithm。每种方法都是性能、哈希大小和冲突频率之间的折衷。一个好的选择取决于你的数据和你的限制。在这需要一些努力才能找到最佳解决方案。只有当您需要经常执行此操作时才值得开始。在
相关问题 更多 >
编程相关推荐