Python - 文件中的行 - 所有组合

1 投票
3 回答
807 浏览
提问于 2025-04-15 11:15

我有两个文件,分别是 prefix.txt 和 terms.txt,里面大约各有 100 行内容。我想要生成一个第三个文件,这个文件包含这两个文件的 笛卡尔积

http://en.wikipedia.org/wiki/Join_(SQL)#Cross_join

这样会大约有 10000 行。

在 Python 中,最好的做法是什么呢?

其次,有没有办法把这 10000 行以随机的顺序写入第三个文件呢?

3 个回答

1

笛卡尔积就是列出所有可能的组合。列出所有组合最简单的方法就是用嵌套循环。

想要以随机的顺序写入文件其实不太容易。要写到一个“随机”的位置,你需要用到 file.seek() 这个命令。但是,你怎么知道要去哪个位置呢?你又怎么知道每一部分(前缀+词条)的长度是多少呢?

不过,你可以把整个文件读到内存里(100行其实没什么),然后在内存中以“随机”的顺序处理这些内容。这样可以确保输出是随机的。

1
from random import shuffle
a = list(open('prefix.txt'))
b = list(open('terms.txt'))
c = [x.strip() + y.strip() for x in a for y in b]
shuffle(c)
open('result.txt', 'w').write('\n'.join(c))

当然,这种方法在速度和内存方面不是最优的,但10000这个数字其实也不大,不值得为了简洁而牺牲性能。通常情况下,你应该关闭你的文件对象,而且你可以在不把文件内容存到内存里的情况下,至少循环读取其中一个文件。这里的 [:-1] 是用来去掉 ab 每个元素末尾的换行符。

补充:使用 s.strip() 来去掉换行符,比用 s[:-1] 更加通用。

4

你需要用到 itertools.product

for prefix, term in itertools.product(open('prefix.txt'), open('terms.txt')):
    print(prefix.strip() + term.strip())

你可以把它们打印出来,或者累积起来,或者直接写入文件。你需要用 .strip() 是因为每个内容后面都有换行符。

之后,你可以用 random.shuffle(list(open('thirdfile.txt')) ) 来打乱它们的顺序,不过我不确定在你使用的文件大小下,这个速度会有多快。

撰写回答