Python 为什么要多次打印而不是只打印一次?
我有一个\n分隔字符串(strings.txt)的输入列表,我试图将每个字符串与输入文件(infielist.tsv)中的一行匹配一次,并将每一行打印到一个新文件(outfile.tsv) 我的outfile.tsv只打印了infielist.tsv,打印次数与我搜索的输入字符串相同,而不是一次。我的for(for)循环不正确地只与infielist.tsv文件相乘,而不是与单个匹配行相乘,这有什么问题 示例脚本 strings.txt 填充列表 outfile.tsv 是一个双for循环。对于列表中的每个项目,Python 为什么要多次打印而不是只打印一次?,python,Python,我有一个\n分隔字符串(strings.txt)的输入列表,我试图将每个字符串与输入文件(infielist.tsv)中的一行匹配一次,并将每一行打印到一个新文件(outfile.tsv) 我的outfile.tsv只打印了infielist.tsv,打印次数与我搜索的输入字符串相同,而不是一次。我的for(for)循环不正确地只与infielist.tsv文件相乘,而不是与单个匹配行相乘,这有什么问题 示例脚本 strings.txt 填充列表 outfile.tsv 是一个双for循环。对于
inlist
,它将遍历tsvin
中的每一行
因此,这不仅仅是在tsvin
中迭代一次,而是重复迭代len(inlist)
次数
相反,您可以通过
tsvin
,通过一次迭代来实现目标:
with open('strings.txt', 'rb') as inlist, open('infilelist.tsv', 'rb') as tsvin, open('outfile.tsv', 'wb') as outobj:
seen = set([line.strip() for line in inlist])
for line in tsvin:
if line.split('\t', 1)[0] in seen:
outobj.writelines(line)
注意
seen = set([line.strip() for line in inlist])
正在创建一组列表中的所有行
line.split('\t', 1)[0] in seen
将选项卡上的tsvin
中的行最多拆分1次,并检查第一部分是否在集合seen
中,同时检查列表中的成员身份是O(n)
。因此,您可以通过将seen
设置为集合而不是列表来节省一些时间
是一个双for循环。对于列表中的每个项目,inlist
,它将遍历tsvin
中的每一行
因此,这不仅仅是在tsvin
中迭代一次,而是重复迭代len(inlist)
次数
相反,您可以通过tsvin
,通过一次迭代来实现目标:
with open('strings.txt', 'rb') as inlist, open('infilelist.tsv', 'rb') as tsvin, open('outfile.tsv', 'wb') as outobj:
seen = set([line.strip() for line in inlist])
for line in tsvin:
if line.split('\t', 1)[0] in seen:
outobj.writelines(line)
注意
seen = set([line.strip() for line in inlist])
正在创建一组列表中的所有行
line.split('\t', 1)[0] in seen
将选项卡上的tsvin
中的行最多拆分1次,并检查第一部分是否在集合seen
中,同时检查列表中的成员身份是O(n)
。因此,您可以通过将seen
设置为集合而不是列表来节省一些时间
是一个双for循环。对于列表中的每个项目,inlist
,它将遍历tsvin
中的每一行
因此,这不仅仅是在tsvin
中迭代一次,而是重复迭代len(inlist)
次数
相反,您可以通过tsvin
,通过一次迭代来实现目标:
with open('strings.txt', 'rb') as inlist, open('infilelist.tsv', 'rb') as tsvin, open('outfile.tsv', 'wb') as outobj:
seen = set([line.strip() for line in inlist])
for line in tsvin:
if line.split('\t', 1)[0] in seen:
outobj.writelines(line)
注意
seen = set([line.strip() for line in inlist])
正在创建一组列表中的所有行
line.split('\t', 1)[0] in seen
将选项卡上的tsvin
中的行最多拆分1次,并检查第一部分是否在集合seen
中,同时检查列表中的成员身份是O(n)
。因此,您可以通过将seen
设置为集合而不是列表来节省一些时间
是一个双for循环。对于列表中的每个项目,inlist
,它将遍历tsvin
中的每一行
因此,这不仅仅是在tsvin
中迭代一次,而是重复迭代len(inlist)
次数
相反,您可以通过tsvin
,通过一次迭代来实现目标:
with open('strings.txt', 'rb') as inlist, open('infilelist.tsv', 'rb') as tsvin, open('outfile.tsv', 'wb') as outobj:
seen = set([line.strip() for line in inlist])
for line in tsvin:
if line.split('\t', 1)[0] in seen:
outobj.writelines(line)
注意
seen = set([line.strip() for line in inlist])
正在创建一组列表中的所有行
line.split('\t', 1)[0] in seen
将选项卡上的tsvin
中的行最多拆分1次,并检查第一个部分是否在集合seen
中,同时检查列表中的成员身份是否为O(n)
。因此,您可以通过将设置为一个集合而不是一个列表来节省一些时间。我看不出您在哪里实际显示了您的问题所在。也许您可以澄清一下?代码的意图不清楚。您能否提供strings.txt和infielist.tsv的示例,并显示您期望outfile.tsv的外观比如?我看不出你在哪里实际显示了你的问题所在。也许你可以澄清一下?代码的意图不清楚。你能提供一个strings.txt和infielist.tsv的示例,并展示你期望outfile.tsv的样子吗?我看不到你在哪里实际显示了你的问题所在。也许你可以澄清一下吗?这个示例的意图是什么代码不清楚。能否提供strings.txt和infielist.tsv的示例,并显示您期望outfile.tsv的外观?我看不出您实际在哪里显示问题所在。也许您可以澄清一下?代码的意图不清楚。能否提供strings.txt和infielist.tsv的示例,并显示您期望outil的内容e、 tsv看起来像什么?正确,我认为这是做这件事所需要的(?)但它似乎只是输出tsvin中每一行的字符串/项目数。这很好,解释了双for循环和使用set而不是list。正确,我认为这是做这件事所需要的(?)但它似乎只是输出tsvin中每一行的字符串/项的数量。这非常好,解释了双for循环和set而不是list的用法。正确,我认为这就是需要做的(?)但它似乎只是输出tsvin中每一行的字符串/项的数量。这非常好,解释了双for循环和set而不是list的用法。正确,我认为这就是需要做的(?)但它似乎只输出tsvin中每一行的字符串/项目数。这很好,解释了双for循环和set而不是list的用法。