首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用从第一列派生的关系,从两列文件的第二列构造边缘列表

使用从第一列派生的关系,从两列文件的第二列构造边缘列表
EN

Stack Overflow用户
提问于 2016-09-20 02:49:54
回答 1查看 23关注 0票数 1

我有一个问题,我有一个几百万行的文件,排列方式如下:

代码语言:javascript
复制
1    Protein_A
1    Protein_B
2    Protein_A 
3    Protein_C
4    Protein_A
4    Protein_B
4    Protein_C
4    Protein_D
5    Protein_C
5    Protein_D

其中第一列表示相互作用途径,第二列表示蛋白质的ID。有没有人能推荐一种有效的方法,我可以将其归入每个网络中仅有(非互惠的)相互作用的边缘列表中,例如:

代码语言:javascript
复制
1    Protein_A,Protein_B
4    Protein_A,Protein_B
4    Protein_A,Protein_C
4    Protein_A,Protein_D
4    Protein_B,Protein_C
5    Protein_C,Protein_D
5    Protein_C,Protein_D

或者告诉我在哪里可以找到这样的数据?

我尝试了一个shell脚本,它缓慢地迭代文件,并删除文件末尾的新行,结果如下:

代码语言:javascript
复制
1    Protein_A    1    Protein_B

然后可以将其加工成边缘,但是如果网络中有两个以上的蛋白质,这就不起作用。我一片空白。有人能帮帮忙吗?

提前谢谢你。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-20 03:01:41

使用python和一些智能模块相当容易。我已经将文件内容嵌入到一个字符串中。只需替换为data = open("input.txt")即可从文件中读取(也可迭代)。

我创建了一个字典,将数字作为关键字,将与数字匹配的蛋白质列表作为值。

构建完成后,我使用大小为2的itertools.combinations生成列表,并在生成过程中输出密钥。

代码语言:javascript
复制
import re
import collections,itertools

data="""1    Protein_A
1    Protein_B
2    Protein_A
3    Protein_C
4    Protein_A
4    Protein_B
4    Protein_C
4    Protein_D
5    Protein_C
5    Protein_D""".split("\n")

d = collections.defaultdict(lambda : list())

for l in data:
    fields = re.split("\s+",l.strip())
    d[int(fields[0])].append(fields[1])

for k,v in d.items():
    for a,b in itertools.combinations(v,2):
        print(k,a,b)

结果:

代码语言:javascript
复制
(1, 'Protein_A', 'Protein_B')
(4, 'Protein_A', 'Protein_B')
(4, 'Protein_A', 'Protein_C')
(4, 'Protein_A', 'Protein_D')
(4, 'Protein_B', 'Protein_C')
(4, 'Protein_B', 'Protein_D')
(4, 'Protein_C', 'Protein_D')
(5, 'Protein_C', 'Protein_D')
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39580130

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档