Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 关于嵌套循环的问题_Python_Loops_Nested - Fatal编程技术网

Python 关于嵌套循环的问题

Python 关于嵌套循环的问题,python,loops,nested,Python,Loops,Nested,我是编程新手,在计算嵌套循环时遇到了一些问题。我有一个要从较大文件中提取的数据列表。我能够从更大的文件中成功提取一项数据,但我需要从这个包含数千个试验的更大文件中提取100个不同的试验。每个试验都是较大文件的一行数据。这是我用来一次成功提取一行数据的程序。在本例中,它提取试验1的数据。它基于我在前面的问题和教程中看到的示例。问题是我不需要1-100次试验,也不需要任何有序模式。我需要试验134、274、388等等,它会跳来跳去。因此,如果for语句没有可以输入的范围,我不知道如何使用for语句执

我是编程新手,在计算嵌套循环时遇到了一些问题。我有一个要从较大文件中提取的数据列表。我能够从更大的文件中成功提取一项数据,但我需要从这个包含数千个试验的更大文件中提取100个不同的试验。每个试验都是较大文件的一行数据。这是我用来一次成功提取一行数据的程序。在本例中,它提取试验1的数据。它基于我在前面的问题和教程中看到的示例。问题是我不需要1-100次试验,也不需要任何有序模式。我需要试验134、274、388等等,它会跳来跳去。因此,如果for语句没有可以输入的范围,我不知道如何使用for语句执行嵌套循环。感谢您的帮助。谢谢

completedataset = open('completedataset.txt', 'r')

smallerdataset = open('smallerdataset.txt', 'w')


for line in completedataset:
    if 'trial1' in line: smallerdataset(line)


completedataset.close()
smallerdataset.close()
我真的很想这样做:

completedataset = open('completedataset.txt', 'r')
smallerdataset = open('smallerdataset.txt', 'w')

trials = [134, 274, 388]
completedata = completedataset.readlines()

for t in trials:
    for line in completedata:
        if "trial"+str(t) in line:
            smallerdataset.write(line)
completedataset.close()
smallerdataset.close()
试验=(‘试验12’、‘试验23’、‘试验34’)

对于completedataset中的行: 关于审判中的审判: 如果在线试验:smallerdataset(线)


但这不起作用。有人能帮我修改一下这个程序,使它能正常工作吗?

在我看来,您需要一个包含您感兴趣的所有试用号的列表。也许你可以试试这样的东西:

completedataset = open('completedataset.txt', 'r')
smallerdataset = open('smallerdataset.txt', 'w')

trials = [134, 274, 388]
completedata = completedataset.readlines()

for t in trials:
    for line in completedata:
        if "trial"+str(t) in line:
            smallerdataset.write(line)
completedataset.close()
smallerdataset.close()

你可以这样做:

trials = ['trial1', 'trial134', 'trial274']

for line in completedataset:
    for trial in trials:
        if trial in line: smallerdataset(line)

为了更有效地进行操作,您可以将每一行与'trial[0-9]+'-regex匹配,并查找是否可以从集合中找到符号。

如果完整集合中的每个试用都是已知的字节大小,您可以使用
文件。seek(n)
,其中
n
是开始读取的字节。例如,如果文件中的每行长度为3字节,则可以执行以下操作:

myfile = open('file.txt', 'r')
myfile.seek(lineToStartAt * 3)

myfile.readline()#etc

如果每行的字节数是可变的或未知的,您只需读入行并丢弃不需要的行(如中所示)

假设您提前知道测试,您可以这样做

trials = ('trial12', 'trial23', 'trial34')

for line in completedataset:
    for trial in trials:
        if trial in line: smallerdataset(line)

您将在指定试验的方式上遇到一些问题。如果查找包含“trial1”的行,还将得到包含“trial123”的行。如果以某种方式构建了较大的数据集,则可以尝试在特定字段中查找试用编号。例如,如果数据以逗号分隔,则可以使用csv包。最后,使用生成器表达式而不是循环将使事情变得更清晰。假设试用号位于数据集的第一列,您可以执行以下操作:

import csv

trials = ['trial134', 'trial1', 'trial56']
data = csv.reader(open('completedataset.txt'))

with open('smalldataset.txt','w') as outf:
    csv.writer(outf).writerows(l for l in data if l[0] in trials)

假设您有一个函数,通过查看一行,可以告诉您该行是否是“所需的”,那么代码的正确结构将非常简单:

with open('completedataset.txt', 'r') as completedataset:
    with open('smallerdataset.txt', 'w') as smallerdataset:
        for line in completedataset:
            if iwantthisone(line):
                smallerdataset.write(line)
with
语句负责为您关闭。在Python2.7中,可以将带有s的两个
合并为一个;在Python2.5中,您需要使用一个
from\uuuuuu future\uuuuu import with_语句启动模块;在Python2.6(目前最流行的版本)中,上述代码是正确的形式

所以,所有的一切都可以归结为
i和thisone
函数。你没有告诉我们你的台词的格式,这使得我们无法进一步帮助你。但是,假设每行中的第一个单词标识测试,例如,
test432…
,并且您在名为
want\u这些
的集合中有您想要的测试的编号,例如
集合([113,432,251,…])
。那么,编写
我想要的这个
的一个非常简单的方法可能是:

def iwantthisone(line):
    firstword = line.split(None, 1)[0]
    testnumber = int(firstword[4:])
    return testnumber in want_these
当然,
我想要这一行的正确内容完全取决于你的行的格式,以及你如何判断你实际上想要保留哪些行。但我希望这个总体结构仍然有帮助


请注意,我推荐的这个通用结构中实际上没有嵌套循环!)

关于您在注释中显示的错误消息:行继续字符是反斜杠,因此它告诉您该行中的某个位置有一个错误的反斜杠字符。

假设行始终以试用标识符开头,您可以使用startswith函数和过滤器来提取所需的字符

completedataset = open('completedataset.txt', 'r')
smallerdataset = open('smallerdataset.txt', 'w')

wantedtrials = ('trial134', 'trial274', 'trial388')

for line in completedataset:
    if filter(line.startswith, wantedtrials):
        smallerdataset.write(line)

每次试验是否保证在相应的生产线上进行?(即第一行的
trial1
,依此类推……)此外,每行的长度是否固定?如果您可以粘贴数据集文件的一个小样本,这可能会很有用。我不愿意共享文件的实际内容,但不幸的是,第655行没有试用版687。所以它们不匹配。所以我首先尝试了这个,因为它看起来最简单,一行接一行地显示意外字符,并突出显示“:”。建议?所以我先试试这个,因为它看起来最简单,一行接一行地显示意外字符,并突出显示“:”。建议?它突出显示了哪个“:”?正如Haukur所建议的,听起来好像在一行的末尾有一个反斜杠。我真的不知道我能做些什么来帮助你,而不看你的代码。