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

Python-文件中的行-所有组合,python,file-io,random,Python,File Io,Random,我有两个文件-prefix.txt和terms.txt都有大约100行。我想用笛卡尔积写出第三个文件 -大约10000行 在Python中实现这一点的最佳方法是什么 其次,是否有办法将10000行以随机顺序写入第三个文件?笛卡尔乘积枚举所有组合。枚举所有组合的最简单方法是使用嵌套循环 您不能很容易地以随机顺序写入文件。要写入“随机”位置,必须使用file.seek()。你如何知道你将寻求什么样的职位?您如何知道每个部件(前缀+术语)的长度 但是,您可以将整个文件读入内存(100行不算什么),并

我有两个文件-prefix.txt和terms.txt都有大约100行。我想用笛卡尔积写出第三个文件

-大约10000行

在Python中实现这一点的最佳方法是什么


其次,是否有办法将10000行以随机顺序写入第三个文件?

笛卡尔乘积枚举所有组合。枚举所有组合的最简单方法是使用嵌套循环

您不能很容易地以随机顺序写入文件。要写入“随机”位置,必须使用
file.seek()
。你如何知道你将寻求什么样的职位?您如何知道每个部件(前缀+术语)的长度


但是,您可以将整个文件读入内存(100行不算什么),并以“随机”顺序处理内存中的集合。这将确保输出是随机的。

笛卡尔乘积枚举所有组合。枚举所有组合的最简单方法是使用嵌套循环

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))
您不能很容易地以随机顺序写入文件。要写入“随机”位置,必须使用
file.seek()
。你如何知道你将寻求什么样的职位?您如何知道每个部件(前缀+术语)的长度

但是,您可以将整个文件读入内存(100行不算什么),并以“随机”顺序处理内存中的集合。这将确保输出是随机的

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的大小不足以牺牲简洁性。通常,您应该关闭文件对象,并且可以循环浏览至少一个文件,而无需将其内容存储在RAM中。这:
[:-1]
a
b
的每个元素中删除尾随的新行

编辑:使用
s.strip()
而不是
s[:-1]
来摆脱换行符——它更便于携带

当然,就速度和内存而言,这不是最好的方式,但10000的大小不足以牺牲简洁性。通常,您应该关闭文件对象,并且可以循环浏览至少一个文件,而无需将其内容存储在RAM中。这:
[:-1]
a
b
的每个元素中删除尾随的新行


编辑:使用
s.strip()
而不是
s[:-1]
来摆脱换行符——它更便于携带。

您需要
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'))对它们进行洗牌,但我不知道在您使用的大小的文件上洗牌的速度有多快。

您需要
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'))对它们进行洗牌我不知道你使用的文件的大小有多快。

我至少会考虑索引的交叉乘积,而不是实际的行……这样你就可以从A和B中选择行,只需要存储两个文件的内容加上整数对的洗牌列表,这可能比较便宜。比存储要输出的文件的所有10000行要好得多。我想这取决于行长度。正如我所说的,这远不是最优的,但相当简洁。你知道,对于这样一个小的输入,“最佳方法”很可能意味着“写可读代码”。Blair,对行的洗牌与对整数的洗牌一样快(列表是“指针数组”(毕竟!),您的方法将产生间接寻址的成本,这无疑会使其比ngn的解决方案慢。在内存中存储一两兆字节的文本(如果输入文件中的平均行为50-100字节)我不会考虑这些日子的问题,至少我会考虑索引的交叉乘积,而不是实际的行……这样,你可以从A和B中选择行,只需要存储两个文件的内容加上整对的洗牌列表,这可能比存储所有10000行O要便宜。f要输出的文件。我想这取决于行长度。正如我所说的,这远不是最优的,但相当简洁。你知道,对于这样小的输入,“最佳方法”很可能意味着“编写可读代码”。Blair,对行的洗牌将与对整数的洗牌一样快(列表毕竟是“指针数组”)你的方法会产生间接寻址的成本,这无疑会使它比ngn的解决方案慢。在内存中存储一两兆字节的文本(如果输入文件中的平均行为50-100字节)这不是一个值得担心的问题。如果我尝试以随机顺序处理100行文件…我需要防止10000行输出中出现重复。我该怎么做?阅读随机模块文档,寻找类似shuffle的方法。如果我尝试以随机顺序处理100行文件…我需要防止10行输出中出现重复000行输出。我该怎么做呢?阅读随机模块文档,寻找像shuffle这样的方法。我认为假设这是一个家庭作业问题是一个很大的飞跃…也许我很愤世嫉俗,但是100行前缀和100行术语有太多的整数和大量的零,除了家庭作业之外,没有任何东西。此外,没有过滤事实上,它有127个词条和93个前缀。我把数字四舍五入到100,这样我就可以在头脑中进行乘法运算,让问题更清楚。我正在做一些“搜索和排序”实验。我需要创建一个大列表。前缀和词条的叉积似乎是最快的方法。但是