1

Python初学者在这里。我有两个具有相同格式的制表符分隔信息的文本文件。它们包含 3 列(标识符、染色体和位置)的行,例如:

文件 1:

2323 2 125
2324 3 754

... ETC

文件 2:

2323 2 150
2324 3 12000

... ETC

我想通过遍历一个文件中的每个标识符(每行中的第一列)并关联它与它的位置(column3),然后在下一个文件中找到这个匹配的标识符,并将另一个位置(column3)保存在这个文件中。所以最后每个标识符将与来自两个不同文件的 2 个不同位置相关联。

这是我需要帮助的。对于下一步,我将寻找位置之间数值差异最大的标识符。

非常感谢任何帮助、提示或解决方案,我是一个具有非常基础知识的 Python 初学者。

提前谢谢了!

鲁巴尔

4

3 回答 3

2
import collections
d=collections.defaultdict(list)
for f in ('file1','file2'):
    with open(f) as f1:
        for line in f1:
            ident, chrom, pos = line.split()
            d[ident].append(int( pos ))


#big differences at end of list
items = sorted(d.items(), key = lambda item: abs(item[1][1] - item[1][0])) 

#big differences at beginning of list
#items = sorted(d.items(), reverse = True, key = lambda item: abs(item[1][1] - item[1][0])) 

在此解决方案中,我将文件中的信息存储为字典。键是标识符,值是包含位置的列表。然后,我根据位置列表中第一个和第二个元素之间差异的绝对值对该字典的项目进行排序。换句话说,最大的区别在items列表的末尾。

为了使它起作用,它假定file1file2具有相同的标识符。如果没有,您首先需要过滤项目以仅挑选出长度为 2 的字典条目。例如

items = [(k,v) for k,v in d.items() if len(v) == 2]
items = sorted(items, ...)
于 2012-08-13T19:46:36.537 回答
2

您的问题可以有几个答案:

  1. 如果您打算对矩阵进行大量计算,我建议您查看非常有效的numpy库。您可以在此处查看如何使用 numpy 创建矩阵。
  2. 您的问题的第二个可能答案是使用biopython库(我已经得出结论,您正在使用染色体)。
  3. 您可以使用 Python 嵌套列表来创建矩阵。

这是如何执行此操作的代码片段(假设我们正在从文件 2 中读取)

matrix = []
with open(path_to_file2, 'rt') as f:
    for line in f:
        matrix.append(map(int, line.strip().split(' ')))

然后,您可以获取创建的矩阵的值:

matrix[0]     # First row == [2323, 2, 150]
matrix[0][1]  # Second column, first row == 2
于 2012-08-13T19:42:37.810 回答
1

您可以使用以标识符作为键、位置列表作为值的字典。然后您可以计算位置之间的差异并将其作为列表的第三个元素。然后,您可以遍历字典,在字典值的位置 [2] 中找到最大值。

d = {}
for each line in file1:
   d[identifier] = [position]

for each line in file2:
   d[identifier].append(position)
   d[identifier].append(d[identifier][1]-d[identifier][0])

maxDiff = 0
for x in d:
    value = d[x][2]
    if value > maxDiff:
        maxDiff = value
于 2012-08-13T19:46:22.493 回答