Python 如何让内部for循环在外部for循环每次迭代时都进行迭代?

Python 如何让内部for循环在外部for循环每次迭代时都进行迭代?,python,Python,我有两个文件,我试图将第二个文件最后一列中的字符串附加到包含第一个文件中信息的数组中的数组中。我希望仅当第二个文件的第二列中的数字介于第一个文件的第一列和第二列的数字之间时,才附加这些字符串 这是我的档案: 阅读。床: chromA 10 69 read1 chromA 10 35 read2 chromA 10 55 read3 chromA 15 69 read4 chromA 80 119

我有两个文件,我试图将第二个文件最后一列中的字符串附加到包含第一个文件中信息的数组中的数组中。我希望仅当第二个文件的第二列中的数字介于第一个文件的第一列和第二列的数字之间时,才附加这些字符串

这是我的档案:

阅读。床:

chromA  10      69      read1
chromA  10      35      read2
chromA  10      55      read3
chromA  15      69      read4
chromA  80      119     read5
chromA  80      111     read6
chromA  90      119     read7
chromA  101     119     read8
壮举。床:

chromA  10      19      feat1
chromA  30      39      feat2
chromA  50      69      feat3
chromA  80      89      feat4
chromA  100     119     feat5
这是我的密码:

feat_bed=open("feats.bed","r")
read_bed=open("reads.bed","r")


read_coords=[]
for line in read_bed.readlines():
    line=line.strip()
    line=line.split("\t")
    read_coords.append([int(line[1]),int(line[2]),str(line[3]),[]])


for read in read_coords:
    for feat in feat_bed.readlines():
        feat=feat.strip()
        feat=feat.split("\t")
        if int(read[1]) > int(feat[1]) >= int(read[0]):
            read[3].append(str(feat[3]))
    print read
我的预期产出是:

[10, 69, 'read1', ['feat1', 'feat2', 'feat3']]
[10, 35, 'read2', ['feat1', 'feat2']]
[10, 55, 'read3', ['feat1', 'feat2', 'feat3']]
[15, 69, 'read4', ['feat2', 'feat3']]
[80, 119, 'read5', ['feat4', 'feat5']]
[80, 111, 'read6', ['feat4', 'feat5']]
[90, 119, 'read7', ['feat5']]
[101, 119, 'read8', []]
相反,我的内部for循环似乎只在第一次迭代时才停止,因此我的实际输出是:

[10, 69, 'read1', ['feat1', 'feat2', 'feat3']]
[10, 35, 'read2', []]
[10, 55, 'read3', []]
[15, 69, 'read4', []]
[80, 119, 'read5', []]
[80, 111, 'read6', []]
[90, 119, 'read7', []]
[101, 119, 'read8', []]

我不明白为什么我的内循环在外循环的第一次迭代后停止迭代。如果有人能指出我做错了什么,那将非常有帮助。谢谢。

使用带有标识的内部循环:

feat_bed=open("feats.bed","r")
read_bed=open("reads.bed","r")


read_coords=[]
for line in read_bed.readlines():
    line=line.strip()
    line=line.split("\t")
    read = [int(line[1]),int(line[2]),str(line[3]),[]]

    for feat in feat_bed.readlines():
        feat=feat.strip()
        feat=feat.split("\t")
        if int(read[1]) > int(feat[1]) >= int(read[0]):
            read[3].append(str(feat[3]))
    print read

这是因为
readlines()
读取文件中当前位置的所有行。因此,在第一次调用
readlines
后,文件指针位于文件末尾,所有后续调用
readlines()
将返回一个空列表


您希望事先将行保存到列表中,如
feat\u lines=feat\u bed.readlines()
,然后在预先保存的行列表上迭代,如:
对于feat\u行中的feat:

,该列表仍然存在相同的问题(
对于feat\u bed.readlines()):
将只在外循环的第一次迭代中起作用)对Rikoo的极好建议!你的建议奏效了,现在我更了解readlines()的机制了。太好了!很高兴听到这个消息。请记住,所有文件方法的工作方式都是相同的(
read()
readline()
等)。可以选择使用
seek
将文件指针移回起始位置,但我更愿意避免这样做