2

所以,我有一个巨大的输入文件,看起来像这样:(你可以在这里下载

 1. FLO8;PRI2
 2. FLO8;EHD3
 3. GRI2;BET2
 4. HAL4;AAD3
 5. PRI2;EHD3
 6. QLN3;FZF1
 7. QLN3;ABR5
 8. FZF1;ABR5
 ...

看它就像一个两列的表格,即“;”之前的元素 显示到“;”之后的元素

我想迭代地打印简单的字符串,以显示构成前馈循环的三个元素。上面的示例编号列表将输出:

"FLO8 PRI2 EHD3"
"QLN3 FZF1 ABR5"
...

将第一条输出线解释为前馈循环:

A -> B  (FLO8;PRI2)
B -> C  (PRI2;EHD3)
A -> C  (FLO8;EHD3)

只有这个链接中圈出的那个

所以,我有这个,但它非常慢......有什么建议可以更快地实现吗?

import csv

TF = []
TAR = []

# READING THE FILE
with open("MYFILE.tsv") as tsv:
    for line in csv.reader(tsv, delimiter=";"):
        TF.append(line[0])
        TAR.append(line[1])

# I WANT A BETTER WAY TO RUN THIS.. All these for loops are killing me    
for i in range(len(TAR)):
    for j in range(len(TAR)):
        if ( TAR[j] != TF[j] and TAR[i] != TF[i] and TAR[i] != TAR[j] and TF[j] == TF[i] ): 
            for k in range(len(TAR )):
                    if ( not(k == i or k == j) and TF[k] == TAR[j] and TAR[k] == TAR[i]):
                        print "FFL: "+TF[i]+ " "+TAR[j]+" "+TAR[i]

注意:我不想要自循环...从 A -> A、B -> B 或 C -> C

4

2 回答 2

2

我使用集合的字典来允许非常快速的查找,如下所示:

编辑:防止自循环:

from collections import defaultdict

INPUT = "RegulationTwoColumnTable_Documented_2013927.tsv"

# load the data as { "ABF1": set(["ABF1", "ACS1", "ADE5,7", ... ]) }
data = defaultdict(set)
with open(INPUT) as inf:
    for line in inf:
        a,b = line.rstrip().split(";")
        if a != b:          # no self-loops
            data[a].add(b)

# find all triplets such that A -> B -> C and  A -> C
found = []
for a,bs in data.items():
    bint = bs.intersection
    for b in bs:
        for c in bint(data[b]):
            found.append("{} {} {}".format(a, b, c))

在我的机器上,这在 0.36s 内加载数据,在 2.90s 内找到 1,933,493 个解;结果看起来像

['ABF1 ADR1 AAC1',
 'ABF1 ADR1 ACC1',
 'ABF1 ADR1 ACH1',
 'ABF1 ADR1 ACO1',
 'ABF1 ADR1 ACS1',

Edit2:不确定这是你想要的,但如果你需要 A -> B 和 A -> C 和 B -> C 但不是 B -> A 或 C -> A 或 C -> B,你可以试试

found = []
for a,bs in data.items():
    bint = bs.intersection
    for b in bs:
        if a not in data[b]:
            for c in bint(data[b]):
                if a not in data[c] and b not in data[c]:
                    found.append("{} {} {}".format(a, b, c))

但这仍然返回 1,380,846 个解决方案。

于 2014-04-17T02:06:57.527 回答
0

测试集

    targets = {'A':['B','C','D'],'B':['C','D'],'C':['A','D']}

和功能

    for i in targets.keys():
        try:
            for y in targets.get(i):
                #compares the dict values of two keys and saves the overlapping ones to diff
                diff = list(set(targets.get(i)) & set(targets.get(y)))
                #if there is at least one element overlapping from key.values i and y
                #take up those elements and style them with some arrows
                if (len(diff) > 0 and not i == y):
                    feed = i +'->'+ y + '-->'
                    forward = '+'.join(diff)
                    feedForward = feed + forward
                    print (feedForward)

        except:
            pass

输出是

 A->B-->C+D
 A->C-->D 
 C->A-->D
 B->C-->D

问候 Radboud 计算生物学课程,Robin(2016 年第一季度)。

于 2016-10-20T15:39:09.493 回答