【问题标题】:Python - How can I exclude lines from the same file in itertools.combinations using fileinput?Python - 如何使用文件输入从 itertools.combinations 中的同一文件中排除行?
【发布时间】:2021-02-11 01:24:28
【问题描述】:

这是我第一次使用 python。我有 4 个 .txt 文件,其中包含单词“圆形”、“方形”、“点”和“点”的潜在字典变体。例如,

circle
circlE
circl3
..
square
squarE
squar3
..
dot
doT
d0t
..
point
poinT
po1nt

我正在尝试创建另一个 .txt 文件,其中包含这 4 个文件中每一行的所有可能组合。我有以下代码可以成功创建所有组合:

import fileinput
from itertools import combinations
from contextlib import closing
with closing(fileinput.input(['circle.txt', 'square.txt', 'dot.txt', 'point.txt'])) as f:
    for w, x, y, z in combinations(f, 4):
          t = open("circlesquaredotpoint.txt", "a")
          t.write('{}{}{}{}'.format(w.rstrip('\n'), x.rstrip('\n'), y.rstrip('\n'), z.rstrip('\n'))+'\n')       
          t.close()

但它太大了,因为它正在组合来自同一个文件的元素。以下是前几个结果:

circlecirclEcircl3circLe
circlecirclEcircl3circLE
circlecirclEcircl3circL3

我想从同一文件中排除任何行组合,以免重复术语。

【问题讨论】:

    标签: python file-io combinations itertools


    【解决方案1】:

    如果您将项目分成不同的类别并希望从每个类别中进行选择,则称为 product() 而不是 combination()。例如,

    import itertools as it
    
    A = [1,2,3]
    B = [4,5,6]
    
    print(list(it.product(A,B)))
    

    不知道为什么你的代码是这样的。我可能会这样写:

    import itertools as it
    
    filenames = ['circle.txt', 'square.txt', 'dot.txt', 'point.txt']
    words     = [(word.strip() for word in open(f)) for f in filenames]
    data      = (''.join(prod)+'\n' for prod in it.product(*words)])
    open("circlesquaredotpoint.txt",'w').writelines(data)
    

    【讨论】:

    • 成功了,谢谢。我不得不将我的页面文件增加到 200 GB 以避免 MemoryError。然后我发现生成的 .txt 文件大约 10 GB。我低估了我的输入数据会产生多少结果,这仅适用于 circlesquaredotpoint。我还需要为每个订单创建它们,但我认为我有足够的空间。只需要一些时间来生成每个。
    • 我没有意识到您正在处理大数据,您应该使用迭代器而不是显式加载所有数据。这不会使用任何内存。我会更新答案。
    • 已更新。它现在应该不需要任何 ram。它只会加载使用和写入每个计算步骤所需的数据。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-12
    相关资源
    最近更新 更多