有没有办法在python中使用AND两个字符串?

时间:2015-12-09 19:39:01

标签: python python-2.7 filtering mask

所以我有几个非常大的文件代表人类基因组中的每个位置。对于基因组中每个位置的某种类型的“得分”,这两个文件都是二元掩模,我感兴趣的是得到一个新的掩模,其中两个分数都是“1”,即两个掩模的交叉点。

例如:

File 1:          00100010101
File 2:          11111110001
Desired output:  00100010001

在python中,将这些大文件(它们包含50-250万个字符)读成字符串真的很快。但是,我不能只将&字符串放在一起。我可以做类似

的事情
bin(int('0001',2) & int('1111', 2))

但是有没有更直接的方法,我不需要填充额外的0并最终转换回字符串?

1 个答案:

答案 0 :(得分:0)

我认为对二进制和操作的内置整数类型的转换可能比逐字符工作要快得多(因为Python的int是用C而不是Python编写的)。我建议你在输入文件的每一行上工作,而不是同时处理整个数百万字符的字符串。二进制和操作不需要任何携带,因此单独使用每一行都没有问题。

为了避免笨拙的字符串操作将结果填充到正确的长度,您可以使用str.format方法将整数转换为一次性的正确长度的二进制字符串。这是一个将输出写入新文件的实现:

import itertools

with open(filename1) as in1, open(filename2) as in2, open(filename3, "w") as out:
    for line1, line2 in itertools.izip(in1, in2):
        out.write("{0:0{1}b}\n".format(long(line1, 2) & long(line2, 2), len(line1) - 1))

我正在使用字符串格式化迷你语言的一个简洁功能,使用第二个参数为转换后的数字传递所需的长度。如果您可以依赖总是具有50个二进制数字的行(包括文件末尾),则可以使用{:050b}对代码进行硬编码,而不是从输入行的长度进行计算。