Python 使用从第一列派生的关系从两列文件的第二列构造边列表
我有一个问题,我有一个文件,上面有几百万行这样排列:Python 使用从第一列派生的关系从两列文件的第二列构造边列表,python,bash,shell,unix,Python,Bash,Shell,Unix,我有一个问题,我有一个文件,上面有几百万行这样排列: 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 其中第1列表示相互作用途径,第2列表示蛋白质的ID。有人能推荐一种有效的方法吗?我可以将其分类为每个网络中仅包含(非互惠)相互作用的边缘列表,
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
其中第1列表示相互作用途径,第2列表示蛋白质的ID。有人能推荐一种有效的方法吗?我可以将其分类为每个网络中仅包含(非互惠)相互作用的边缘列表,例如:
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脚本,它缓慢地遍历文件并删除文件末尾的新行,结果如下:
1 Protein_A 1 Protein_B
这可以被加工成一个边缘,但是如果一个网络中有两个以上的蛋白质,这就不起作用了。我画的是空白。有人能帮忙吗
提前谢谢。使用python和一些智能模块相当简单。我已将文件内容嵌入到字符串中。只需替换为
data=open(“input.txt”)
即可从文件中读取(也可读取)
我创建了一个以数字为键的字典,并将与数字匹配的蛋白质列表作为值
构建完成后,我使用大小为2的itertools.compositions
生成列表,同时打印密钥
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)
结果:
(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')